Attualmente sto sperimentando alcune cose molto strane. Quando passo una struct da C++ a una DLL Delphi come parametro, tutto funziona correttamente. Tuttavia, non appena voglio ricevere un record come risultato ottengo valori errati o eccezioni. Ho disattivato l'allineamento del record in modo che il loro passaggio potesse funzionare! Ecco il codice!Passaggio record come risultato di una funzione da Delphi DLL a C++
Delphi DLL:
TSimpleRecord = packed record
Nr1 : Integer;
Nr2 : Integer;
end;
//...
function TTest() : TSimpleRecord; cdecl;
begin
Result.Nr1 := 1;
Result.Nr2 := 201;
ShowMessage(IntToStr(SizeOf(Result)));
end;
C++ chiamata:
#pragma pack(1)
struct TSimpleRecord
{
int Nr1;
int Nr2;
};
//...
typedef TSimpleRecord (__cdecl TestFunc)(void);
TestFunc* Function;
HINSTANCE hInstLibrary = LoadLibrary("Reactions.dll");
if (hInstLibrary)
{
Function = (TestFunc*)GetProcAddress(hInstLibrary, "TTest");
if (Function)
{
TSimpleRecord Result = {0};
Result = Function();
printf("%d - %d - %d", sizeof(Result), Result.Nr1, Result.Nr2);
cin.get();
}
}
Io ho idea del perché questo record passando come parametro opere, ma non come risultato di una funzione !?
Qualcuno può aiutarmi `
Grazie
PS:? Come ho già detto, sia C++ e Delphi mostrano che il record è di 8 byte di grandi dimensioni.
Si sta effettivamente impostando il valore di ritorno nella funzione Delphi? – Angew
Result.Nr1: = 1; Result.Nr2: = 201; Questo dovrebbe fare il lavoro – Henry
Spiacente, quando ho interagito con Delphi per ultimo, 'Result' utilizza ancora l'identificatore di funzione, IIRR. – Angew