1

アンマネージ C++ から C# へのリバース PInvoke を実行しています。これには C++/CLI を使用したくありません。アンマネージ C++ および C# でこれを完全に実行したいと考えています。

構造体へのポインターを C# に渡す必要があります。私はこの StackOverflow スレッドを読みました - IntPtr とは正確には何ですか? -これを行うために IntPtr を使用できること。

これは私のマネージド メソッド シグネチャです public int Start(string commandName, IntPtr a) { .... }

IDispatch::Invoke メソッドを使用してネイティブ コードから呼び出しています。私はこのようにDISPPARAMSを構築しました

VARIANT pVarArgs[2];
BSTR bstrCommandName = NULL;
pVarArgs[0].vt = VT_INT| VT_PTR; // | VT_BYREF;
pVarArgs[0].pintVal = reinterpret_cast<int*>(context); //context is a pointer to a structure. 

pVarArgs[1].vt = VT_BSTR;
pVarArgs[1].bstrVal = bstrCommandName;    // Allocated elsewhere
DISPPARAMS dispparamsTwoArgs = {pVarArgs, NULL, 2};
//Invoke the method on the Dispatch Interface
hr = pDisp->Invoke(
                    dispid,
                    IID_NULL,
                    LOCALE_SYSTEM_DEFAULT,
                    DISPATCH_METHOD,
                    &dispparamsTwoArgs,
                    &varResult,
                    &exception,
                    &uArgErr
);

これは私が得るエラーコードです - 0x80070057

私の質問は次のとおりです。
2. IDispatch::Invoke がこれを行う最善の方法である場合、このエラーを修正するにはどうすればよいですか? 構造体へのポインターをネイティブの世界から管理された世界に渡す必要があります。

4

0 に答える 0