C # passa int e stringa facendo riferimento al controllo ActiveX C ++: tipo non corrispondente
-
22-07-2019 - |
Domanda
Ho un problema nel passare dal riferimento int o dalle variabili stringa al controllo ActiveX C ++. Inoltre passo queste variabili facendo riferimento alla DLL C ++ e tutto funziona bene.
DLL C ++:
__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
Come eseguire questa operazione in Controllo ActiveX? Ho provato a definire metodi usando & amp; simbolo di riferimento, ma il compilatore MIDL non lo ha consentito.
MyCOM.idl:
[id(1025315)] void Execute (LPCTSTR cmd, [out]long& returnCode); // MIDL2025: syntax error
Ho modificato i metodi per utilizzare i puntatori *.
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);
La stessa eccezione si verifica utilizzando invece il tipo di stringa in C # e LPCTSTR * in ActiveX C ++. Eventuali suggerimenti o suggerimenti saranno apprezzati.
Soluzione
RISOLTO:
In MyCOMCtrl.cpp:
// Dispatch map
...
DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_PI4)
...
Deve essere:
DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_BSTR VTS_PI4) // two VTS arguments
Altri suggerimenti
Questo è solo un tiro lungo (nessun gioco di parole previsto), ma prova a usare il "lungo" tipo di dati per la tua variabile .net resultCode.