Windows Runtime Cpp ランタイムオブジェクト生成のソースを表示
新しいページはコチラ
移動:
案内
,
検索
== '''概要''' == RoActiveInstanceという関数でランタイムオブジェクトをDLLから生成できるようになっています。以下のように聞いたことのないようなIInspectable型変数を引数にとる形式になっています。 *'''RoActiveInstance'''(HSTRING型変数, IInspectable型ポインタ変数のポインタ変数) :第一引数:オブジェクトクラス名を保持したHSTRING型の変数です。 :第二引数:IInspectable型の変数に生成されたランタイムオブジェクトを受け取ります。この変数はCOMの技術を継承した変数です。 ラインタイムオブジェクトを生成する上記の関数を利用するには#include <windows.ui.xaml.h>として、ヘッダファイルを読み込む必要があります。このヘッダファイルを読み込むことで多くのぶら下がっているヘッダファイルも読み込まれる仕組みになっています。デフォルトではライブラリはC:\Program Files (x86)\Windows Kits\8.1\Include\winrtとかに保存されているはずです。 いかに示すサンプルでは IApplication型のポインタ変数を作成し、これのアドレスを引数とすることでIInspectable型ポインタ変数のポインタ変数(アドレス変数のアドレス変数)としています。安全にキャストできるらしいです。IInspectable,IApplicationはいずれもCOMの技術を利用したものです。IApplication型は名前空間ABI::Windows::UI::Xaml;に定義されている変数です。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <vector> #include <algorithm> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> #include <windows.ui.xaml.h> using namespace ABI::Windows::UI::Xaml; int main() { HRESULT hr; setlocale(LC_ALL, ""); GetCurrentTime(); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } const wchar_t *pcStrClassName = RuntimeClass_Windows_UI_Xaml_Application; size_t sizeStrClassName = wcslen(pcStrClassName); HSTRING HSTRING_StrClassName; HRESULT HRESULT_Hr; HRESULT_Hr = WindowsCreateString(pcStrClassName, sizeStrClassName, &HSTRING_StrClassName); if (FAILED(HRESULT_Hr)) { wprintf_s(L"HSTRING_StrClassNameの生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"HSTRING_StrClassNameの生成に成功しました。\n"); } IApplication *pIApplicationObj; HRESULT_Hr = RoActivateInstance(HSTRING_StrClassName, (IInspectable**)&pIApplicationObj); if (FAILED(HRESULT_Hr)) { wprintf_s(L"HSTRING_StrClassNameのRuntimeObject生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"HSTRING_StrClassNameのRuntimeObject生成に成功しました。\n"); } HSTRING HSTRING_GetStrClassName; HRESULT_Hr = pIApplicationObj->GetRuntimeClassName(&HSTRING_GetStrClassName); if (FAILED(HRESULT_Hr)) { wprintf_s(L"HSTRING_StrClassNameの取得に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"HSTRING_StrClassNameの取得に成功しました。\n"); } ULONG ULONG_IidCnt; IID *pIID_Iids; HRESULT_Hr = pIApplicationObj->GetIids(&ULONG_IidCnt, &pIID_Iids); if (FAILED(HRESULT_Hr)) { wprintf_s(L"IIDの取得に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"IIDの取得に成功しました。\n"); } for (ULONG ULONG_i = 0; ULONG_i < ULONG_IidCnt; ULONG_i++) { wprintf_s(L"IID[%d]=%x-%x-%x-", ULONG_i, (pIID_Iids + (int)ULONG_i)->Data1, (pIID_Iids + (int)ULONG_i)->Data2, (pIID_Iids + (int)ULONG_i)->Data3); for (int iN = 0; iN < 8; iN++) { wprintf_s(L"%x", *((pIID_Iids + (int)ULONG_i)->Data4 + iN)); } wprintf_s(L"\n"); } wprintf_s(L"\n"); RoUninitialize(); _wsystem(L"pause"); } </syntaxhighlight> 実行結果 初期化に成功しました。 HSTRING_StrClassNameの生成に成功しました。 HSTRING_StrClassNameのRuntimeObject生成に成功しました。 HSTRING_StrClassNameの取得に成功しました。 IIDの取得に成功しました。 IID[0]=74b861a1-7487-46a9-9a6ec78b512726c5 IID[1]=25f99ff7-9347-459a-9facb2d0e11c1af IID[2]=b3ab45d8-6a4e-4e76-a0d32d4643a9f1a IID[3]=19104be-522a-5904-f52fde721429e0 IID[4]=db5cd2b9-d3b4-558c-c64e434fd1bd889 IID[5]=b775ad7c-18b8-45ca-a1b0dc483e4b1028 IID[6]=38-0-0-c000000046 IID[7]=df0b3d60-548f-101b-8e65802b2bd119 IID[8]=0-0-0-c000000046 IID[9]=af86e2e0-b12d-4c6a-9c5ad7aa65101e90 続行するには何かキーを押してください . . . サンプルでは生成したランタイムオブジェクトのすべてのIIDをリストアップするプログラムになっています。なんかGUIDみたいな不気味なIDでカッコいいと思うのはマイクロソフトファンだけでしょうか?私の場合は9つもぶら下がってました。IIDはインタフェースIDと呼ばれています。GUIDの形式になっています。 *ABI :Application Binary Interfaceの略。 アプリケーションをバイナリーレベルで変換するインターフェイスのこと。 *XAML(ザムル) :Extensible Application Markup Languageの略。 マイクロソフトが開発したアプリ開発向けXMLですね。このXMLでUIを記述するような感じです。
Windows Runtime Cpp ランタイムオブジェクト生成
に戻る。
個人用ツール
3.142.237.38
このIPアドレスのトーク
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ