我在这个页面上看到动态数组需要ShareMem单元才能正常工作.
但是我想为其他语言编写一个dll.
谁能告诉我如何声明函数及其参数来传递String数组?
如果没有ShareMem,是不是真的不允许这样?
var templates : array of WideString; begin SetLength(templates,2); templates[0] := 'template1'; templates[1] := 'template2'; end DLLFunction(@templates[0]);
感谢帮助!
动态字符串数组已经是PWideChar / PAnsiChar的数组(对于WideString或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;