1

我正在做一个从非托管 C++ 到 C# 的反向 PInvoke。我不想为此使用 C++/CLI。我想完全使用非托管 C++ 和 C# 来完成这项工作。

我需要将指向结构的指针传递给 C#。我在这个 StackOverflow 线程上读到 -究竟什么是 IntPtr?- 我可以使用 IntPtr 来执行此操作。

这是我的托管方法签名 public int Start(string commandName, IntPtr a) { .... }

我使用 IDispatch::Invoke 方法从我的本机代码调用它。我像这样构建了DISPARAMS

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 更好的反向 PInvoke 方法?
2. 如果 IDispatch::Invoke 是最好的方法,我该如何解决这个错误?我需要将指向结构的指针从本地世界传递到托管世界。

4

0 回答 0