c# pass int and string c ++ activex 컨트롤 : 유형 불일치
-
22-07-2019 - |
문제
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 변수를 위해 "긴"데이터 타입을 사용해보십시오.
제휴하지 않습니다 StackOverflow