我正在使用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的确切数据类型。
还告诉我在我的项目中使用它的正确步骤。
答案 0 :(得分:4)
LPTSTR
只是指向原始字符数据的指针。 Delphi的等效值是PAnsiChar
或PWideChar
,具体取决于DLL是为Ansi还是Unicode编译的。 LPTSTR
始终是Delphi 2007及更早版本(包括Delphi 7)中的Ansi,并且在Delphi 2009及更高版本中始终是Unicode,因此您可能需要考虑到这一点。如果DLL是为Unicode编译的,则必须使用PWideChar
而不是LPTSTR
。因此,最好直接使用PAnsiChar
和PWideChar
而不是LPTSTR
来避免不同环境之间的不匹配(除非DLL为两种类型导出函数的单独版本,例如大多数Win32 API函数确实如此。
此外,根据DLL使用的实际调用约定,该函数可能正在使用cdecl
或stdcall
。在没有明确的调用约定的情况下,大多数C / C ++编译器都使用cdecl
,但它们可以很容易地使用stdcall
而不是记录它。所以你需要找出答案,因为它会产生 BIG 差异,因为cdecl
和stdcall
对于堆栈管理和参数传递有不同的语义。
因此,如上所述,正确的函数声明将是:
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)分配它们,或确保每个模块释放它所做的分配。