【问题标题】:delphi string to "const buffer"delphi字符串到“const缓冲区”
【发布时间】:2011-04-22 11:30:31
【问题描述】:

我有一个程序接受的 dll:“const buffer”参数。

还有一个给这个参数传值的例子:

var
str: array [0..200 - 1] of Char;
LTextSend: string;
begin
  LTextSend := 'Text';
  StrLCopy(PChar(@str[0]), PChar(LTextSend), High(str));

  Dll_procedure(str, Length(LTextSend));
end;
  1. 这个参数只能通过这个声明来传递吗:str:array [0..200 - 1] of Char;

  2. 难道没有更简单的方法可以将字符串(不同长度的)传递给这个 dll 参数吗?

谢谢

【问题讨论】:

  • 这里的 200 似乎是任意选择,DllProc 接受 var 长度的字符串。
  • 为了让我们帮助您,您需要提供 1) DLL 程序的签名,2) DLL 程序的官方文档,以及 3) 您的 Delphi 版本(尤其是 2009 年之前或2009 年以上)。

标签: string delphi constants buffer


【解决方案1】:

你可以这样调用这个过程:

DLL_procedure(str[1], Length(str));

这是因为 Delphi 无类型参数的发送方式与 var 参数相同,它们是通过引用发送的。编译器将发送一个指向str[1] 的指针,这是字符串中的第一个字符,但这实际上是指向整个字符串的指针。像往常一样,确保字符串实际上包含第一个字符(即:它不为空)。

您的第 1 个问题完全取决于 DLL。 “签名”允许发送任意长度的数据,但这并不意味着 DLL 已为任何事情做好了准备。也许它一次只能处理 200 个字节。

【讨论】:

  • 抱歉,我在现已删除的 cmets 中随机爆发。
  • @David,没有看到任何随机爆发,现在你让我好奇了。
  • 我对空字符串上的 str[1] 感到紧张。我想这会引发范围错误。但是我弄乱了我的 cmets 并删除了,因为你确实解决了这个问题。
【解决方案2】:

我不知道你为什么要复制到临时缓冲区。

只有Dll_procedure 会修改缓冲区才有意义。但我怀疑它会。

所以你可以简单地写:

Dll_procedure(Pointer(LTextSend)^, Length(LTextSend));

或在调用之前使字符串唯一的变体:

Dll_procedure(LTextSend[1], Length(LTextSend));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多