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.