ciao, ho questo file con un interfaccia che espone i metodi di una classe in c#.
Adesso ho compilato il file con regasm e ho creato un .tlb.codice:public interface ICDeserialize { long dox(ref int i, ref Int64 res); void proprieta(Int64 nPippo, Int64 nPippo2); } public class CDeserialize { public CDeserialize() { // // TODO: Add constructor logic here // } public long dox(ref Int64 i, ref Int64 res) { i = 10; return 1; } public long proprieta(int nPippo, int nPippo2) { nPippo = 2; }
Poi importo il tlb in c++ e richiamo le funzioni, cosi:
Il problema è che finchè utilizzo dei metodi senza puntatori e senza tipi ritornati in c++ funziona, quando provo a passare dei puntatori o a farmeli ritornare ottengo un errorecodice:. #import "ifc2.tlb" . . CoInitialize(NULL); IFC2::ICDeserializePtr ptr; CLSID clsid; IUnknown *punk; HRESULT hr = CLSIDFromProgID(L"IFC2.CDeserialize", &clsid); //CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(IFC), (LPVOID *)&valid); hr = CoCreateInstance(clsid, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&punk) ; hr = punk->QueryInterface(__uuidof(IFC2::_CDeserialize), (void**)&ptr); long x = 0; INT64 h = 0; hr = ptr->dox(&x,&h); ************************************errore CoUninitialize();
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
questa è la dichiarazione del metodo nel file .tli creato dall importazione della libreria com .tlb generata dal regasm:
inline __int64 ICDeserialize::dox ( long * i, __int64 * res ) {
__int64 _result = 0;
HRESULT _hr = raw_dox(i, res, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _result;
}
Come devo impostare la funzione per farmi ritornare unpuntatore?
grazie.

Rispondi quotando