在delphi7中调用C ++ dll函数

时间:2013-11-12 11:18:03

标签: c++ delphi visual-c++ dll delphi-7

我正在使用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的确切数据类型。

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

2 个答案:

答案 0 :(得分:4)

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而不是记录它。所以你需要找出答案,因为它会产生 BIG 差异,因为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,以及它是使用cdecl还是stdcall。 / p>

答案 1 :(得分:0)

首先,重新装入Delphi字符串,因此不是指向char(LPTSTR)的指针。我建议你避免那些陷阱作为初学者,并选择直接指针。

第二个LPTSTR是指向一个字节字符(LPSTR)的指针,或指向两个字节字符(LPWSTR)的指针,具体取决于是否定义了UNICODE。

所以正确的解决方案是使函数返回pansichar或pwidechar,具体取决于在C ++程序中如何定义UNICODE。

如果您开始在不同语言之间传递字符缓冲区,请确保它们使用相同的分配器来(de)分配它们,或确保每个模块释放它所做的分配。