C # — обратный PInvoke с использованием IDispatch :: Invoke

Я делаю обратный PInvoke из неуправляемого C ++ в C #. Я не хочу использовать C ++ / CLI для этого. Я хочу сделать это полностью с неуправляемыми C ++ и C #.

Мне нужно передать указатель на структуру в C #. Я прочитал в этой теме StackOverflow — Что такое IntPtr? — что я могу использовать IntPtr для этого.

Это моя подпись управляемого метода
public int Start (строка 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. Есть ли лучший способ сделать Reverse PInvoke, чем использовать IDispatch :: Invoke?
2. Если IDispatch :: Invoke — лучший способ сделать это, как я могу исправить эту ошибку? Мне нужно передать указатель на структуры из родного мира в управляемый мир.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]