String delphi字符串到";常量缓冲区“;
我有一个dll,该程序接受:“const buffer”参数 还有一个向该参数传递值的示例: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; 此参数只能通过以下声明传递
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_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]感到紧张。我想这会引起射程误差。但是我把我的评论弄得一团糟,并且删除了,因为你确实解决了这个问题。