crossframe » C++/CLI http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 C++ Standard Template Library ../../../201506271043/ ../../../201506271043/#comments Sat, 27 Jun 2015 12:23:08 +0000 ../../../?p=1043 最近は、すっかり使わなくなってしまいましたが、C++をちょっと見直す機会があり、再学習とこれから使うためのリファレンスの意味で、興味がある機能を並べてました。

環境 : VisualStudio 2010 / Windows 7

#include "stdafx.h"
#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;
typedef deque<int> INTDEQUE;

void p(int n)
{
	cout << n << " ";
}
int main(array<System::String ^> ^args)
{
	INTDEQUE  dq;

	dq.push_front(3);
	dq.push_front(2);
	dq.push_front(1);
	dq.insert(dq.begin(), 0);
	dq.push_back(9);

	cout << "start : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	INTDEQUE::reference reff = dq.front();
	INTDEQUE::reference ref2 = dq[2];
	INTDEQUE::reference refe = dq.back();

	reff = 10;
	ref2 = 12;
	refe = 19;

	cout << "refer : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	dq.pop_front();
	dq.pop_front();

	cout << "pop   : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	dq.push_back(21);
	dq.push_back(22);

	cout << "push  : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	random_shuffle(dq.begin(), dq.end());

	cout << "shuff : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	rotate(dq.begin(), dq.begin() + 1, dq.end());
    
	cout << "rotat : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	dq.erase(dq.end()-2,dq.end());
	
	cout << "erase : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	getchar();

    return 0;
}

実行結果
cppstl01
プロジェクトは「Visual C++ CLRコンソールアプリケーション」です。
実行結果に、コメントとその結果があるので、説明は省きます。

参考 : https://msdn.microsoft.com/ja-jp/library/f1dtts6s%28v=vs.90%29.aspx

]]>
../../../201506271043/feed/ 0
C++/CLI + XAML ../../../20130503227/ ../../../20130503227/#comments Fri, 03 May 2013 04:07:55 +0000 http://xfra.me/?p=227 前々回のC++/CX + XAML に比較して、C++/CLIでもできるのかどうかテストしたところ、一応(形の上では?)できたので備忘録としておきたいと思います。
(WebViewもトライしてみましたができませんでした。方法はあるのかな?)

環境 : VisualStudio2012 / Windows 8
プロジェクトは、C++ CLRの空のプロジェクトを選びました。

using namespace System;
using namespace System::IO;
using namespace System::Windows;
using namespace System::Windows::Markup;
using namespace System::Windows::Navigation;
using namespace System::Threading; 

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	FileStream^ fs = gcnew FileStream("xamltest.xaml", FileMode::Open, FileAccess::Read);
	Window^ win =  safe_cast<Window^>( XamlReader::Load(fs) );

	if(win != nullptr){
		win->Show();
	}
	Thread::Sleep(1000);

    return 0;
}

xamltest.xaml

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
	Title="XamlTest" Height="300" Width="500">
	<Grid>
		<Label VerticalAlignment="Center" HorizontalAlignment="Center">Xaml Test</Label>
	</Grid>
</Window>

実行すると、1秒間だけ以下の画面が表示されます。

xamtest

]]>
../../../20130503227/feed/ 0
C++/CX WinRTコンポーネントとJavaScript ../../../20130428219/ ../../../20130428219/#comments Sat, 27 Apr 2013 16:34:56 +0000 http://xfra.me/?p=219 WinRTと呼ばれるWindowsストアアプリのランタイムライブラリが、Windows8の大きな特徴になります。これは、MS-DOS、Windows、.NETという変化に匹敵するものだと思います。
これまでの環境との互換性のしくみはなかなか複雑です。C++/CLIとC++/CXの違いについて誤解しやすいので、このあたり実際にプログラムを作りながら理解を深めているところです。
これら二つは共存できないもので、入れ替えるのもののようです。しかしコードはとてもよく似ています。C++/CLIの特徴であったマネージ領域のポインタの代替えのトラッキングハンドラ(キャレット文字(ハット記号)で表す)が使われます。
今回は、JavaScriptのストアアプリからC++/CX関数への値の受け渡しのテストをしました。C++/CXをランタイムコンポーネントとしてビルドして、これをストアアプリのプロジェクトから参照をします
前回も、JavaScriptからC++/CXを呼び出すことをしていますが、意味的にはかなり違っていると思います。
サンプルは、JavaScriptで配列をつくり、C++/CX側で合計を計算して引数の値と掛け合わせたあと、JavaScriptに値を戻しています。

環境 : VisualStudio2012 / Windows8

C++側
プロジェクトで、C++ -> ストアアプリ -> Windowsランタイムコンポーネントを選択します。

Class1.cpp

#include "pch.h"
#include "Class1.h"

using namespace cppStoreRunCompo02;
using namespace Platform;

Class1::Class1(){}

int Class1::arrSum(const Array<int>^ arr, int num)
{
    int sum = 0;
    for(int i = 0 ; i < arr->Length; i++)
    {
        sum += arr[i];
    }
    return sum * num;
}

JavaScript側
プロジェクトで、JavaScript -> ストアアプリ -> 空のアプリケーションを選択します。

default.js

(function () {
    "use strict";
    WinJS.Binding.optimizeBindingReferences = true;
    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            } else {
            }
            args.setPromise(WinJS.UI.processAll());
        }
    };
    app.oncheckpoint = function (args) {
    };

    app.start();

    var cpp = new cppStoreRunCompo02.Class1();
    var arr = new Array(10);
    for (var i = 0; i < arr.length; i++) {
        arr[i] = i;
    }
    var sum = cpp.arrSum(arr, 2);
    alert("SUM : " + sum);
})();
function alert(str) {
    var md = new Windows.UI.Popups.MessageDialog(str);
    md.showAsync();
}

cppsum
WinRTは、C++/CXを使う以外にも、標準C++でWRT(Windows Runtime C++ Template Library)というものから使えるようです。試しにC++/CLIでWRTを使おうとしましたが、やはりだめでした。
これはCOMの改良版ということのようですが、.NETから進化しているものなのか、それともシンプル化したものなのか、そしてこの先どの方向に進んでいくのか、とても気になります。
このWinRTの存在は、今後のWindowsを占う上でも、とても重要なものとなりそうです。

]]>
../../../20130428219/feed/ 0
Java Native Interface : C++/CLI ../../../2013021475/ ../../../2013021475/#comments Thu, 14 Feb 2013 14:01:22 +0000 http://xfra.me/?p=75 .NETフレームワークのC++/CLIの柔軟性を示す例として、一つの文字列を4つの方法でコンソール出力をしてみた。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <jni.h>
#include <iostream>

using namespace System;

void JavaPrint(char*);

int main(array<System::String ^> ^args)
{
	char str[100];

	sprintf(str, "Hello World\n");

	// .Net
	String^ s = gcnew String(str);
	Console::Write(s);

	// Win
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	WriteConsole(hStdout, (CONST VOID *)str, (DWORD)strlen(str), NULL, NULL);

	// Std C
	printf("%s", str);

	// Java
	JavaPrint(str);

	std::cout << "Hit any key ..." << std::endl;
	getchar();
    return 0;
}

void JavaPrint(char *str)
{
	JNIEnv* env;
    JavaVM* jvm;
	JavaVMOption options[3];
	JavaVMInitArgs vm_args;

    options[0].optionString = "-Xmx128m";
    options[1].optionString = "-verbose:gc";
    options[2].optionString = "-Djava.class.path=C:/temp";

    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 3;

	JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
	
    jclass clazz = env->FindClass("JPrint");
	jmethodID mid = env->GetStaticMethodID(clazz, "SystemPrint", "(Ljava/lang/String;)V");
	env->CallStaticVoidMethod(clazz, mid, env->NewStringUTF(str));

    jvm->DestroyJavaVM();
}

これを実行すると以下のようになります。

Console4

Javaのコードはコンパイルして、C:\tempにclassファイルを配置しておきます。

public class JPrint{
	public static void SystemPrint(String arg){
		System.out.print(arg);
	}
}

なんか面白い。自己満足!(ネタ的にはちょっと古いけど、残しておきたかったので)
重要なのは、.NETにもJavaにも同時にアクセスできてしまうということです。
(こういうの過去資産の活用に使えるんですよね。)

最近C++/CXというものもでてきましたが、ネイティブとも.NETとも違うまた新しいスタイル(WinRT)の開発をすることができます。C++/CLIも陳腐化してしまうのかなぁ。
また勉強しないと・・

]]>
../../../2013021475/feed/ 0