una matriz dinámica de cadenas ya es una matriz de PWideChar/PAnsiChar
(por WideString or UnicodeString/AnsiString
).
Esta matriz dinámica se puede asignar directamente como es, sin copia de la memoria, de la mayoría de las lenguas, como una matriz de PWideChar/PAnsiChar
:
De persona que llama:
DLLFunction(length(templates),pointer(templates));
De DLL:
type
TPAnsiCharArray = array[0..MaxInt div SizeOf(PAnsiChar)-1] of PAnsiChar;
PPAnsiCharArray = ^TPAnsiCharArray;
TPWideCharArray = array[0..MaxInt div SizeOf(PWideChar)-1] of PWideChar;
PPWideCharArray = ^TPWideCharArray;
procedure DLLFunction(argc: integer; argv: PPWideCharArray);
var i: integer;
begin
for i := 0 to argc-1 do
writeln(argv[i]);
end;
Desde un dll C por ejemplo, puede usar char **argv
en lugar de PPAnsiCharArray
y void **argv
en lugar de PPWideCharArray
.
A continuación, puede convertir fácilmente de nuevo la PWideChar/PAnsiChar
en el tipo de cadena nativo de la lengua.
Si sólo necesita escribir una DLL de Delphi, puede utilizar
type
TAnsiStringArray = array[0..MaxInt div SizeOf(AnsiString)-1] of AnsiString;
PAnsiStringArray = ^TAnsiStringArray;
TWideStringArray = array[0..MaxInt div SizeOf(WideString)-1] of WideString;
PWideStringArray = ^TWideStringArray;
procedure DLLFunction(argc: integer; argv: PWideStringArray);
var i: integer;
begin
for i := 0 to argc-1 do
writeln(argv[i]);
end;
o incluso
DLLFunction(templates);
procedure DLLFunction(const templates: array of WideString);
var i: integer;
begin
for i := 0 to high(templates) do
writeln(templates[i]);
end;
@ user740144, No olvide declarar sus funciones/proc exportados como 'stdcall' si desea usarlo el dll con clientes que no sean Delphi. – Johan
@Johan Puede usar 'stdcall' o' cdecl'. 'stdcall' será algo estándar en Windows, pero' cdecl' también podría tener sentido. La convención '__fastcall' no es tan estándar. –