主题。我想使用字符串而不是 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 并复制一个指针,就是这样。我想让德尔福复制数据。由于这个原因,将参数声明为“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,这可能会起作用。内部格式为string众所周知,版本之间会发生更改,并且您无法正式保证它不会再次更改。
如果您想避免在使用它的任何地方进行强制转换,请尝试包装该函数,如下所示:
procedure SomeExternalProc(s: Pchar); external dllname;
procedure MyExternalProc(s: string); inline;
begin
SomeExternalProc(PChar(local_s));
end;
然后在你的代码中,你调用MyExternalProc
代替SomeExternalProc
,大家都很高兴。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)