C # передать int и строку по ссылке на C ++ ActiveX Control: несоответствие типов - PullRequest
1 голос
/ 01 декабря 2009

У меня проблема с передачей по ссылке int или строковых переменных в C ++ ActiveX Control. Также я передаю эти переменные по ссылке на C ++ DLL, и все работает нормально.

C ++ DLL:

__declspec (dllexport) void
Execute (LPCTSTR cmd, int& resultCode, LPCTSTR& message, long& receiptNumber)
{
    message = _T("ReplyProblem");
    resultCode = 100;
    receiptNumber = -1;
}

C #:

[DllImport("MyCOM.dll", CharSet = CharSet.Unicode)]
public static extern void Execute (string cmd, out int resultCode, out string message, out int receiptNumber);
...
int resultCode = 0;
string message = "";
int receiptNumber = 0;
Execute ("cmd", out resultCode, out message, out receiptNumber); // OK

Как это сделать в ActiveX Control? Я пытался определить методы, используя & символ ссылки, но компилятор MIDL не позволил это.

MyCOM.idl:

[id(1025315)] void Execute (LPCTSTR cmd, [out]long& returnCode); // MIDL2025: syntax error

Я изменил методы для использования указателей *.

MyCOM.idl:

[id(1025315)] void Execute (LPCTSTR cmd, [out]long* returnCode);

MyCOMCtrl.h:

// Dispatch maps
afx_msg void Execute (LPCTSTR cmd, long* resultCode);

MyCOMCtrl.cpp

// Dispatch map
...
DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_PI4)
...

void MyCOMCtrl::Execute (LPCTSTR cmd, long* resultCode)
{
    *resultCode = 111;
}

C #:

using MyCOMLib;
...
MyCOM client = new MyCOM();
int resultCode = 0;

// COMException: Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))
client.Execute ("Test command", out resultCode);

То же исключение возникает при использовании строкового типа в C # и LPCTSTR * в C ++ ActiveX. Любые советы или предложения будут оценены.

Ответы [ 2 ]

1 голос
/ 20 января 2010

РЕШИТЬ:

В MyCOMCtrl.cpp:

// Dispatch map
...
DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_PI4)
...

Должно быть:

DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_BSTR VTS_PI4) // two VTS arguments
0 голосов
/ 01 декабря 2009

Это просто длинный выстрел (без каламбура), но попробуйте использовать тип данных "long" для вашей переменной .net resultCode.

...