Sto provando a utilizzare una DLL C++ da un programma nativo. Seguo lo scenario metodo virtuale come spiegato hereDelphi Da PChar a C++ const char *
consente di dire la mia C firma funzione ++ è della forma
int Setup(const char* szIp, const char* szPort);
e la corrispondente firma Delphi è
function Setup(ip, port: PChar):Integer: virtual; cdecl; abstract;
E da qualche parte dal programma Delphi posso chiamare
pObj.Setup('192.168.1.100', '97777');
Il c ontrol entra nella DLL, ma i parametri formali szIp e szPort ricevono solo il primo carattere dell'ip e della porta che ho passato dal programma delphi.
Capisco che ha a che fare con terminazione null la stringa correttamente in Delphi. Quindi avevo provato anche questo.
var
pzIp, pzPort: PChar;
szIp, szPort: string;
begin
szIp := '192.168.1.2';
szPort := '9777';
//initilize memory for pchar vars
GetMem(pzIp, Length(szIp)+1);
GetMem(pzPort, Length(szPort)+1);
//null terminate the strings
pzIp[Length(szIp)+1] := #0;
pzPort[Length(szPort)+1] := #0;
//copy strings to pchar
StrPCopy(pzIp, szIp);
StrPCopy(pzPort, szPort);
end.
Anche questo non funziona. Quando ho Writeln
pzIp
e pzPort
ottengo risultati strani.
dimenticato di dire, tutte le funzioni di membro dalla DLL C++ sono compilate con __stdcall
ed esportati correttamente
Grazie per la spiegazione più dettagliata: la mia risposta è stata una rapida idea che si è dimostrata giusta, ma la raccomando come risposta da accettare. – IanH
Grazie a @Deltics, ha funzionato. Tuttavia, è stato necessario effettuare un piccolo cambiamento per compilare il programma delphi pObj.Setup (PAnsiChar (sIPAddress), PAnsiChar (sPort)); Un ringraziamento speciale anche a @IanH – rptony