gpt4 book ai didi

string - 使用 Unicode Delphi 调用 DLL 时出错

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

我有一个带有此函数签名的 DLL:

function KP_RecuperarDadosFabricante(EnderecoIp, ChaveAcesso, 
Porta: string; Return: PAnsiChar): Integer; stdcall; external 'Key.dll';

这是 dll 手册中的示例 VB.NET 代码:

Dim ret As Integer 
Dim ptrStr As IntPtr
Dim DadosFab As String

ptrStr = System.Runtime.InteropServices.Marshal.AllocHGlobal(256)
ret = KP_RecuperarDadosFabricante("192.168.1.201", "0", "4370", ptrStr)
DadosFab = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptrStr)
System.Runtime.InteropServices.Marshal.FreeHGlobal(ptrStr)

这是我的德尔福代码:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
Return: string;
pReturn: PAnsiChar;
begin
GetMem(pReturn, 512);
FillChar(pReturn^, 512, 0);
Memo1.Text:='';
if KP_RecuperarDadosFabricante("192.168.1.201", "0", "4370", pReturn) = 1 then
begin
Return := StrPas(pReturn);
ShowMessage(Return);
end
else
begin
ShowMessage('Error');
end;
end;

此代码在 Delphi 7 中运行良好但在 Delphi XE 中运行不佳。它总是返回“错误”。如何使此代码在 Delphi XE 中运行?

最佳答案

如果 DLL 是用 Delphi 7 编写的,则您不能在 Delphi XE 中使用该 DLL。即使您将 string 参数更改为 AnsiString 以使字符大小相同,您仍然坚持这样一个事实,即字符串的内部结构在这些版本之间的某处发生了变化,因此您从 Delphi XE 代码发送的 AnsiString 看起来不会像 Delphi 7 代码期望 AnsiString 的样子。

如果您有权更改和重新编译 DLL,则应该将参数设为 PAnsiChar,就像您在 Windows 上几乎所有其他 DLL 中看到的那样。还要记住将最后的 PChar 参数更改为 PAnsiChar


如果 DLL 是用某种非 Delphi 语言编写的,那么您可能只需更改函数签名即可修复它。非Delphi语言没有Delphi的string类型,所以声明一直都是错误的;当它从 Delphi 7 运行时,你很幸运。将所有参数更改为 PAnsiChar 类型(包括最终参数);然后它们将匹配它们可能来自原始 C 代码的 char* 类型。

关于string - 使用 Unicode Delphi 调用 DLL 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442062/

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