Subj. Me gustaría utilizar cadenas en lugar de PChar porque eso me ahorra mucho fundición, pero si acabo de hacer¿Es seguro pasar Delphi const string params a través de los límites del administrador de memoria?
procedure SomeExternalProc(s: string); external SOMEDLL_DLL;
y luego ponerlo en práctica en algún otro proyecto no compartida con el Administrador de memoria:
library SeparateDll;
procedure SomeExternalProc(s: string);
begin
//a bla bla bla
//code here code here
end;
No tengo (formalmente) ninguna garantía Delphi no decide por ningún motivo alterar la cadena, modificar su contador de referencia, duplicarlo o único, o lo que sea. Por ejemplo
var InternalString: string;
procedure SomeExternalProc(s: string);
begin
InternalString := s;
end;
Delphi incrementa el refcounter y copia un puntero, eso es todo. Me gustaría que Delphi copiara los datos. ¿Declarar el parámetro como "const" lo hace seguro por esa razón? Si no, ¿hay alguna manera de hacerlo? La declaración de parámetro como PChar no parece ser una solución ya que es necesario para su emisión en cada ocasión:
procedure SomeExternalProc(s: Pchar); forward;
procedure LocalProc;
var local_s: string;
begin
SomeExternalProc(local_s); //<<--- incompatible types: 'string' and 'PAnsiChar'
end;
¿Por qué no quieres usar un MM compartido? Siempre que utilice el tipo de cadena, está obligado a Delphi, no puede ser una DLL genérica utilizable desde otros idiomas. ¿Por qué evitar compartir el MM? –
El tipo de cadena es bastante compatible, puede ser interpretado por otros idiomas como PChar. No estoy hablando de devolver cuerdas, por supuesto, solo cadenas de params. – himself
... o paquetes? –