Una matrice dinamica di stringhe è già una serie di PWideChar/PAnsiChar
(per WideString or UnicodeString/AnsiString
).
Questo array dinamico può essere mappato direttamente come è, senza copia della memoria, da molti linguaggi, come un array di PWideChar/PAnsiChar
:
Da chiamante:
DLLFunction(length(templates),pointer(templates));
Da 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;
Da una DLL C, ad esempio, è possibile utilizzare char **argv
anziché PPAnsiCharArray
e void **argv
anziché PPWideCharArray
.
Quindi è possibile convertire facilmente lo PWideChar/PAnsiChar
nel tipo di stringa nativo della lingua.
Se è necessario solo per scrivere un dll Delphi, è possibile utilizzare
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 anche
DLLFunction(templates);
procedure DLLFunction(const templates: array of WideString);
var i: integer;
begin
for i := 0 to high(templates) do
writeln(templates[i]);
end;
fonte
2011-05-05 15:57:08
@ user740144, Non dimenticare di dichiarare le funzioni/procs esportate come 'stdcall' se vuoi usarlo la DLL con i client non-delphi. – Johan
@Johan Puoi usare 'stdcall' o' cdecl'. 'stdcall' sarà un po 'standard in Windows, ma' cdecl' potrebbe anche avere un senso. La convenzione '__fastcall' non è così standard. –