gpt4 book ai didi

C++ dll函数在delphi7中的调用

转载 作者:行者123 更新时间:2023-11-30 01:56:16 26 4
gpt4 key购买 nike

我正在使用 Delphi7,我是新手。我想在我的 Delphi 项目中使用 Dll(在 C++ 中实现)的功能。我在 C++ 中有一个函数声明 - (由第三方提供)语法

LPTSTR GetErrorString(LONG lErrorNumber)

参数

LONG lErrorNumber Error number

结果

LPTSTR Error string

但是当我在 Delphi7 中传递一个值时,比如

GetErrorString(310);

我在我的单位里声明-

Function  GetErrorString(lErrorNumber : LongInt): String;StdCall;

implementation

Function GetErrorString;external 'Third-Party.DLL';

我收到的是空白字符串,而不是实际的错误字符串。我不知道 LPTSTR 的确切数据类型。

同时告诉我在我的项目中使用它的正确步骤。

最佳答案

LPTSTR 只是指向原始字符数据的指针。 Delphi 的等价物是 PAnsiCharPWideChar,具体取决于 DLL 是为 Ansi 还是 Unicode 编译的。 LPTSTR 在 Delphi 2007 及更早版本(包括 Delphi 7)中始终为 Ansi,在 Delphi 2009 及更高版本中始终为 Unicode,因此您可能需要考虑到这一点。如果 DLL 是为 Unicode 编译的,则必须使用 PWideChar 而不是 LPTSTR。因此,最好直接使用 PAnsiCharPWideChar 而不是 LPTSTR 以避免不同环境之间的不匹配(除非 DLL 导出单独版本的这两种类型的函数,就像大多数 Win32 API 函数一样)。

此外,根据 DLL 使用的实际调用约定,函数可能使用 cdeclstdcall。在没有显式调用约定的情况下,大多数 C/C++ 编译器使用 cdecl,但它们也可以很容易地使用 stdcall 而只是不记录它。所以您需要找出答案,因为这会造成差异,因为cdeclstdcall 在堆栈管理和参数传递方面具有不同的语义。

所以,话虽如此,正确的函数声明应该是:

function GetErrorString(lErrorNumber: Integer): PAnsiChar; cdecl; external 'filename.dll';

或者:

function GetErrorString(lErrorNumber: Integer): PWideChar; cdecl; external 'filename.dll';

或者:

function GetErrorString(lErrorNumber: Integer): PAnsiChar; stdcall; external 'filename.dll';

或者:

function GetErrorString(lErrorNumber: Integer): PWideChar; stdcall; external 'filename.dll';

你将不得不做一些研究来找出 DLL 是使用 Ansi 还是 Unicode,以及它是否使用 cdeclstdcall,如果文档没有明确说明该信息。

关于C++ dll函数在delphi7中的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19927720/

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