行う目的
C++からCOM経由でWPFを起動して、デバッグ用GUIとして利用しようとしています。
その際に、WPFに変数のポインターを渡して値を管理させようと考えています。
ですが参考サイトが見つからず、C#とCOM関係の知識が浅いのでやり方が分からない状態です。
(初期化等は省略します。)
コード
C++
1 2 3void SetValue(float *value) 4{ 5 6//- 確認用変数 7 HRESULT hr = S_OK; 8 9//+ DISPIDの取得(関数名の設定) 10 DISPID dispid = 0; 11 OLECHAR *Func_Name[] = { L"SetValue" }; 12 hr = CreateWindow_pIDispatch->GetIDsOfNames(IID_NULL, Func_Name, 1, LOCALE_SYSTEM_DEFAULT, &dispid); 13 assert(!FAILED(hr) && "Func_Name{ SetValue } is not found."); 14 15 16 //+ 引数の設定 17 DISPPARAMS parameter; 18 memset(¶meter, 0, sizeof(DISPPARAMS)); 19 parameter.cNamedArgs = 0; 20 parameter.rgdispidNamedArgs = NULL; 21 parameter.cArgs = 1; //! 呼び出す関数の引数の数 22 23 24 //- 引数の情報を設定する変数 25 VARIANTARG* pVarg = new VARIANTARG[parameter.cArgs]; 26 27 //- 確認用変数 28 int index = 0; 29 30 //+ VARIANTARGSの設定 31 pVarg[index].vt = VT_BYREF | VT_R4; 32 pVarg[index].pfltVal = value; 33 34 35 //- 設定した引数分の情報を格納する 36 parameter.rgvarg = pVarg; 37 38 39 //+ 呼び出し 40 hr = CreateWindow_pIDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, ¶meter, nullptr, NULL, NULL); 41 assert(!FAILED(hr));//エラー 42 43 //- 解放 44 delete[] pVarg; 45 46}
C#
1 2//通らずにエラーになる 3unsafe public void SetValue(float* value)//IntPtrにするべき? 4{ 5 6 Debug.WriteLine( "Number {0}", *value ); 7 *value = 12.0f; 8 Debug.WriteLine( "Number {0}", *value ); 9 10} 11
呼び出しを行ったときのHRESULT
E_NOINTERFACE No such interface supported.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/21 00:40