我在这个页面上看到动态数组需要ShareMem单元才能正常工作。
但是我想为其他语言编写一个dll。
有谁能告诉我如何声明函数及其参数来传递String数组?
如果没有ShareMem,是不是真的不允许这样?
var
templates : array of WideString;
begin
SetLength(templates, 2);
templates[0] := 'template1';
templates[1] := 'template2';
end
DLLFunction(@templates[0]);
感谢您的帮助!
答案 0 :(得分:6)
动态字符串数组已经是PWideChar/PAnsiChar
的数组(对于WideString or UnicodeString/AnsiString
)。
这个动态数组可以按原样直接映射,没有内存副本,大多数语言都是PWideChar/PAnsiChar
的数组:
来自来电者:
DLLFunction(length(templates),pointer(templates));
来自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;
例如,从C dll,您可以使用char **argv
代替PPAnsiCharArray
和void **argv
代替PPWideCharArray
。
然后,您可以轻松地将PWideChar/PAnsiChar
转换回该语言的本机字符串类型。
如果只需要编写Delphi dll,可以使用
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;
甚至
DLLFunction(templates);
procedure DLLFunction(const templates: array of WideString);
var i: integer;
begin
for i := 0 to high(templates) do
writeln(templates[i]);
end;