加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

数组 – 如何在没有ShareMem Unit的情况下将动态字符串数组传递

发布时间:2020-12-14 04:15:39 所属栏目:Windows 来源:网络整理
导读:我在这个页面上看到动态数组需要ShareMem单元才能正常工作. 但是我想为其他语言编写一个dll. 谁能告诉我如何声明函数及其参数来传递String数组? 如果没有ShareMem,是不是真的不允许这样? var templates : array of WideString;begin SetLength(templates,2
我在这个页面上看到动态数组需要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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读