C# 使用IDispatch::Invoke反转PInvoke 我正在从非托管C++到C语言进行反向调用。我不想为此使用C++/CLI。我想用非托管C++和C语言来完成这一工作。
我需要将指向结构的指针传递给C#。我在这个StackOverflow线程上读到--我可以使用IntPtr来做这件事 这是我的托管方法签名 public int Start(字符串commandName,IntPtr a) { .... } 我使用IDispatch::Invoke方法从本机代码中调用它。我这样构造disparamsC# 使用IDispatch::Invoke反转PInvoke 我正在从非托管C++到C语言进行反向调用。我不想为此使用C++/CLI。我想用非托管C++和C语言来完成这一工作。,c#,c++,pinvoke,reverse,intptr,C#,C++,Pinvoke,Reverse,Intptr,我需要将指向结构的指针传递给C#。我在这个StackOverflow线程上读到--我可以使用IntPtr来做这件事 这是我的托管方法签名 public int Start(字符串commandName,IntPtr a) { .... } 我使用IDispatch::Invoke方法从本机代码中调用它。我这样构造disparams VARIANT pVarArgs[2]; BSTR bstrCommandName = NULL; pVarArgs[0].vt = VT_INT| VT_PTR;
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
);
变体pVarArgs[2];
BSTR bstrCommandName=NULL;
pVarArgs[0]。vt=vt_INT | vt_PTR;//比雷夫;
pVarArgs[0].pintVal=reinterpret_cast(上下文)//上下文是指向结构的指针。
pVarArgs[1].vt=vt\u BSTR;
pVarArgs[1]。bstrVal=bstrCommandName;//分配到其他地方
DISPPARAMS dispparamsTwoArgs={pVarArgs,NULL,2};
//调用分派接口上的方法
hr=pDisp->Invoke(
dispid,
IID_NULL,
区域设置\系统\默认设置,
调度方法,
&dispparamsTwoArgs,
&varResult,
&例外情况,
&乌拉尔
);
这是我得到的错误代码-0x80070057
我的问题如下
1.有没有比使用IDispatch::Invoke更好的方法来反转PInvoke?2.如果IDispatch::Invoke是执行此操作的最佳方法,那么如何修复此错误?我需要将指向结构的指针从本机世界传递到托管世界 你正在走向一个充满伤害的世界。使用C++代码中的“导入”指令。我认为你不能这样把C++结构传递给C语言。您是否尝试过传递简单参数,如整数或布尔值?