Próbuję użyć dll C++ z natywnego programu. Śledzę wirtualnego scenariusza metoda jak wyjaśniono hereDelphi PChar do C++ const char *
Powiedzmy moja C podpis funkcja ++ ma postać
int Setup(const char* szIp, const char* szPort);
i odpowiadająca podpis Delphi
function Setup(ip, port: PChar):Integer: virtual; cdecl; abstract;
A gdzieś z programu delphi mogę zadzwonić pod numer
pObj.Setup('192.168.1.100', '97777');
C ontrol wchodzi do biblioteki dll, ale parametry formalne szIp i szPort otrzymują tylko pierwszy znak adresu IP i portu, który przekazałem z programu delphi.
Rozumiem, że ma to związek z zerowym kończeniem łańcucha znaków w delphi. Tak więc próbowałem również następujących.
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.
To też nie działa. Kiedy i Writeln
pzIp
i pzPort
dostaję dziwne wyniki.
Zapomniałem powiedzieć, wszystkie funkcje członka z biblioteki dll C++ są kompilowane z __stdcall
i eksportowane prawidłowo
Dzięki za bardziej szczegółowe wyjaśnienie: moja odpowiedź była szybką myślą, która okazała się słuszna, ale zalecam to jako odpowiedź do zaakceptowania. – IanH
Dzięki @Deltics, to zadziałało. Jednak niewielka zmiana wymagała rzucenia, aby program delphi kompilował się (pObj.Setup) (PAnsiChar (sIPAddress), PAnsiChar (sPort)); Specjalne podziękowania dla @IanH też – rptony