gpt4 book ai didi

delphi - 跨内存管理器边界传递 Delphi const 字符串参数是否安全?

转载 作者:行者123 更新时间:2023-12-03 14:50:18 24 4
gpt4 key购买 nike

主题。我想使用字符串而不是 PChar,因为这样可以省去很多转换,但如果我这样做

procedure SomeExternalProc(s: string); external SOMEDLL_DLL;

然后在其他项目中使用非共享内存管理器实现它:

library SeparateDll;
procedure SomeExternalProc(s: string);
begin
//a bla bla bla
//code here code here
end;

我(正式)不保证 Delphi 不会出于任何原因决定更改字符串、修改其引用计数器、重复或唯一它或其他任何内容。例如

var InternalString: string;

procedure SomeExternalProc(s: string);
begin
InternalString := s;
end;

Delphi 增加 refcounter 并复制一个指针,就是这样。我希望 Delphi 复制数据。由于这个原因,将参数声明为“const”是否会使其安全?如果没有,有办法做到吗?将参数声明为 PChar 似乎不是一个解决方案,因为您每次都需要转换它:

procedure SomeExternalProc(s: Pchar); forward;
procedure LocalProc;
var local_s: string;
begin
SomeExternalProc(local_s); //<<--- incompatible types: 'string' and 'PAnsiChar'
end;

最佳答案

只要您只使用在同一版本的 Delphi 中编译的代码中的 DLL,这可能会起作用。众所周知,字符串的内部格式会在不同版本之间发生变化,并且您无法正式保证它不会再次发生变化。

如果您想避免在使用它的任何地方进行强制转换,请尝试包装该函数,如下所示:

procedure SomeExternalProc(s: Pchar); external dllname;
procedure MyExternalProc(s: string); inline;
begin
SomeExternalProc(PChar(local_s));
end;

然后在您的代码中,您调用 MyExternalProc 而不是 SomeExternalProc,每个人都很高兴。

关于delphi - 跨内存管理器边界传递 Delphi const 字符串参数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3178868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com