Estoy tratando de usar un dll C++ desde un programa nativo. Estoy siguiendo el escenario método virtual como se explica hereDelphi PChar a C++ const char *
permite decir mi C++ firma de la función es de la forma
int Setup(const char* szIp, const char* szPort);
y la firma Delphi correspondiente es
function Setup(ip, port: PChar):Integer: virtual; cdecl; abstract;
Y en alguna parte del programa de Delphi Puedo llamar al
pObj.Setup('192.168.1.100', '97777');
La c ontrol entra en el dll, pero los parámetros formales szIp y szPort solo reciben el primer carácter de la ip y el puerto que he pasado del programa delphi.
Entiendo que tiene que ver con nulo que termina la cadena correctamente en delphi. Así que también intenté lo siguiente.
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.
Esto tampoco funciona. Cuando yo Writeln
pzIp
y pzPort
obtengo resultados extraños.
olvidó decirle, todas las funciones miembro de la DLL de C++ son recopilados con __stdcall
y se exportan correctamente
Gracias por la explicación más detallada: mi respuesta fue rápida, lo que resultó ser cierto, pero lo recomiendo como la respuesta para ser aceptado. – IanH
Gracias @Deltics, eso funcionó. Sin embargo, era necesario realizar un pequeño cambio para que el programa delphi compilara pObj.Setup (PAnsiChar (sIPAddress), PAnsiChar (sPort)); Agradecimiento especial a @IanH también – rptony