LPTSTR
只是一个指向原始字符数据的指针。Delphi 的等价物是PAnsiChar
或PWideChar
,这取决于 DLL 是为 Ansi 还是 Unicode 编译的。 LPTSTR
在 Delphi 2007 及更早版本(包括 Delphi 7)中始终为 Ansi,在 Delphi 2009 及更高版本中始终为 Unicode,因此您可能需要考虑这一点。如果 DLL 是为 Unicode 编译的,则必须使用 uePWideChar
而不是LPTSTR
. 因此,最好直接使用PAnsiChar
,PWideChar
而不是LPTSTR
避免不同环境之间的不匹配(除非 DLL 为这两种类型导出单独的函数版本,就像大多数 Win32 API 函数一样)。
此外,根据 DLL 使用的实际调用约定,该函数可能使用cdecl
或stdcall
. 在没有显式调用约定的情况下,大多数 C/C++ 编译器使用cdecl
,但它们可以很容易地使用stdcall
,只是不记录它。所以你需要找出答案,因为它有很大的不同,因为堆栈管理和参数传递的语义不同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