use*_*144 8 arrays delphi string dll delphi-7
我在这个页面上看到动态数组需要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(for 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;