【问题标题】:Calling C DLL from Delphi program从 Delphi 程序调用 C DLL
【发布时间】:2013-02-18 16:23:50
【问题描述】:

在我的 Delphi 代码中,我必须使用以下原型调用 DLL 的函数(用 Visual C 编写):

int PWFunc(LPCSTR szName, int nWidth, int nHeight, LPCSTR szFileName)

如何将 Delphi AnsiString 变量(用于名称和文件名)转换为函数调用的正确类型参数(LPCSTR szName 和 szFileName)? 我知道 VC LPCSTR 类型对应于 Delphi PAnsiChar 类型,但是将 AnsiString 转换为 PAnsiChar 的正确程序是什么?

【问题讨论】:

  • PAnsiChar(AnsiString(s)) 是您最后一个问题的答案,假设编码是 ANSI。如果编码是 UTF-8,则不同的答案!
  • @henry,你使用的是什么版本的 Delphi?至少在 Delphi 2009 中定义了 LPCSTR 类型...
  • 对于 UTF-8 编码,如果使用 LPCSTR 数据类型定义原型,则可以传递 PAnsiChar(AnsiString(UTF8Encode(s))) 之类的参数值或直接传递 LPCSTR(AnsiString(UTF8Encode(s)))。甚至没有转换为AnsiString,例如PAnsiChar(UTF8Encode(s))LPCSTR(UTF8Encode(s))
  • 您自己尝试过什么?我很确定您的第一次或第二次尝试会产生预期的结果...
  • 在界面的另一边显示代码。 Rudy 的翻译很好,并且在所有操作系统上的行为方式都相同。所以,我们掌握的信息有问题。

标签: delphi dll parameters type-conversion


【解决方案1】:

LPCSTRLPSTR 对应PAnsiChar,所以这就是你使用的:

function PWFunc(szName: PAnsiChar; nWidth, nHeight: Longint;
  szFileName: PAnsiChar): Longint; cdecl { or stdcall, see documentation };
  external 'somedll.dll' name 'PWFunc';

你这样称呼它:

X := PWFunc(PAnsiChar(AnsiString(SomeName)), 17, 33, 
       PAnsiChar(AnsiString(SomeFileName)));

您的函数是stdcall 还是dcecl 取决于编译器设置。阅读文档。如果有疑问,请尝试两者。在我看来,它就像 cdecl,所以从它开始吧。

【讨论】:

  • +1 但我认为 Integer 是 C int 的正确翻译。
  • 嗯,确实,但我们知道它是一个 32 位整数,在这种情况下,与其他语言交互时,我更喜欢使用固定大小的类型。
  • 你说一套做一套。再读一遍你的答案。此外,C int 不是固定大小。因此,int32_t 将匹配 Longint。 int 的最佳匹配是 Integer。
  • 您可能想阅读这篇文章:rvelthuis.de/articles/articles-convert.html
  • 在 C 中,int 可以有各种大小。然而,在 Windows 甚至 OS X(32 位或 64 位)上的 C 中,int 的大小为 32 位,因此,Longint 是更好的选择,IMO。我想我已经阅读了你提到的那篇文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多