使用IDispatch :: Invoke反转PInvoke

时间:2012-11-24 16:51:57

标签: c# c++ pinvoke reverse intptr

我正在从非托管C ++到C#进行反向PInvoke。我不想为此使用C ++ / CLI。我想用非托管C ++和C#完全做到这一点。

我需要将指向结构的指针传递给C#。我在这个StackOverflow线程上读到了 - Just what is an IntPtr exactly? - 我可以使用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

我的问题如下     1.使用IDispatch :: Invoke是否有更好的方法来执行Reverse PInvoke?     2.如果IDispatch :: Invoke是执行此操作的最佳方法,我该如何解决此错误?我需要将指针传递给从原生世界到托管世界的结构。

0 个答案:

没有答案