문제

C ++ ActiveX Control에 참조 INT 또는 문자열 변수로 전달하는 데 문제가 있습니다. 또한 C ++ DLL을 참조하여 이러한 변수를 전달하며 모든 것이 잘 작동합니다.

C ++ DLL :

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

씨#:

[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;
}

씨#:

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*의 String Type을 사용하여 C ++ ActiveX에서 동일한 예외가 발생합니다. 모든 팁이나 제안에 감사드립니다.

도움이 되었습니까?

해결책

해결 :

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

다른 팁

이것은 단지 긴 샷 (pun 의도가 없음)이지만 .NET resultCode 변수를 위해 "긴"데이터 타입을 사용해보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top