【发布时间】:2011-03-11 20:50:35
【问题描述】:
主题。我想使用字符串而不是 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;
【问题讨论】:
-
为什么不想使用共享MM呢?只要您使用绑定到 Delphi 的字符串类型,它就不能是可用于其他语言的通用 DLL。那么为什么要避免分享MM呢?
-
String类型的兼容性很好,可以被其他语言解释为PChar。我不是在谈论返回字符串,当然,只是字符串参数。
-
不要被字符串有一部分布局像 ASCIIZ 数组(或 PChar)这样的事实所迷惑。他们也有数据before 字符串,Delphi 也可以“触摸”该数据。传递一个 ASCIIZ 数组/PChar 假装它是一个字符串,并且您冒着在内存中的数据被 Delphi 代码更改之前的风险,认为它是一个字符串,因此那里有数据。
-
谢谢,我知道。将 pchar 作为字符串传递是不安全的(抛开 Delphi 的自动转换),但将字符串作为 pchar 传递仍然是安全的。
标签: delphi string constants parameters