crossframe » C++/CX 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++/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
C++/CX + XAML WebViewでストアアプリ ../../../20130427201/ ../../../20130427201/#comments Sat, 27 Apr 2013 13:15:23 +0000 http://xfra.me/?p=201 Windowsプラットホームの開発でいろいろと気になったことをテストしてきましたが、いよいよWindowsストアアプリの開発をしようということで、いろいろと準備を始めました。(本当はWindows Phone 8アプリの開発をやりたかったのですが、端末がないのでそれまではストアアプリでやれることはやっておこうと・・)
しかしこのストアアプリ、どんな言語で開発したらいいか、WindowsPhoneアプリへの移行がスムースのスタイルは、過去のライブラリを使う方法等、選択肢がいろいろとある分迷ってしまいます。JavaScript+HTML5かC#+XAMLか、と迷っていたらXAMLでWebViewを使う方法があると知ったので、テストしてみました。

環境: VisualStudio2012 / Windows8

新しいプロジェクトで、Visual C++ -> Windowsストア -> 新しいアプリケーション(XAML) を選びました。
(C#でもいいのですが、新しいC++/CXにも触れたかったので)

MainPage.xaml

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <WebView x:Name="WebView1" ScriptNotify="wv_notify" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,88,0,0"/>
        <Button Content="Button" HorizontalAlignment="Left" Margin="40,28,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>
        <TextBox x:Name="TextBox1" HorizontalAlignment="Left" Margin="166,28,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Height="38" Width="363" TextChanged="TextBox_TextChanged_1"/>
</Grid>

MainPage.xaml.cpp

void MainPage::OnNavigatedTo(NavigationEventArgs^ e)
{
	String^ html = "<html><head><script type='text/javascript'>\n" +
		"function jsFunc1(){ document.getElementById('test1').innerText = 'Hello!';}\n" +
		"function callCpp1(){ window.external.notify('js String');}\n" +
		"</script></head><body><h3>Test Program</h3><div id='test1'>Message area from C++ Program. Press button.</div>\n" +
		"<input type='button' value='btn1'  onClick='callCpp1()'>" +
		"</body></html>";

	WebView1->NavigateToString(html);
}
void cppxamlWebView1::MainPage::Button_Click_1(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
	WebView1->InvokeScript("jsFunc1", nullptr);
}
void cppxamlWebView1::MainPage::wv_notify(Platform::Object^ sender, Windows::UI::Xaml::Controls::NotifyEventArgs e)
{
	TextBox1->Text = e.Value;
}

VisualStudioのデザイナーで作成すると、自動的にたくさんコードを生成するので、重要な部分のみ引用しました。(デフォルトのファイルからこれに関連する部分も修正する必要はあります)使用するXAMLコントロールは、ボタン、テキストボックス、WebViewの3つです。
ボタンを押すと、WebViewのJavaScript関数を呼び出し、divの内容を書き換えます。WebView内のボタンを押すと、JavaScriptがC++の関数を呼び出しテキストボックスを書き換えます。

起動時
webView1

変更後
webView2

偶然、最近のWebViewがらみの話題の延長みたいになってしまいました。

]]>
../../../20130427201/feed/ 0