ciao, ho questo file con un interfaccia che espone i metodi di una classe in c#.
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;
}
Adesso ho compilato il file con regasm e ho creato un .tlb.
Poi importo il tlb in c++ e richiamo le funzioni, cosi:
codice:
.
#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();
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 errore
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.