String delphi字符串到";常量缓冲区“;

String delphi字符串到";常量缓冲区“;,string,delphi,constants,buffer,String,Delphi,Constants,Buffer,我有一个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; 此参数只能通过以下声明传递

我有一个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;
  • 此参数只能通过以下声明传递:str:Char的数组[0..200-1]

  • 有没有更简单的方法将字符串(不同长度)传递给此dll参数


  • 谢谢

    您可以这样调用该过程:

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


    第一个问题完全取决于DLL。“签名”允许发送任意长度的数据,但这并不意味着DLL已准备就绪。可能一次只能处理200个字节。

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

    只有当
    Dll\u过程
    将修改缓冲区时,才有意义。但我怀疑它会

    所以你可以简单地写:

    Dll_procedure(Pointer(LTextSend)^, Length(LTextSend));
    
    或在调用前使字符串唯一的变体:

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

    在这里,200似乎是一个任意的选择,DllProc正在接受var长度的字符串。为了让我们帮助您,您需要提供1)DLL过程的签名,2)DLL过程的官方文档,以及3)您的Delphi版本(特别是在2009或2009+之前)。很抱歉,我在现在删除的评论中随机爆发。@David,没有看到任何随机爆发,现在你让我好奇了。我对空字符串上的str[1]感到紧张。我想这会引起射程误差。但是我把我的评论弄得一团糟,并且删除了,因为你确实解决了这个问题。