C++ C++;delphi7中的dll函数调用
我正在使用Delphi7,我对它是新手。 我想在我的Delphi项目中使用Dll函数(用C++实现)。 我在C++中有一个函数声明-(由第三方给出) 语法 论据C++ C++;delphi7中的dll函数调用,c++,delphi,visual-c++,dll,delphi-7,C++,Delphi,Visual C++,Dll,Delphi 7,我正在使用Delphi7,我对它是新手。 我想在我的Delphi项目中使用Dll函数(用C++实现)。 我在C++中有一个函数声明-(由第三方给出) 语法 论据 LONG lErrorNumber Error number 结果 LPTSTR Error string 但是当我在Delphi7中传递一个值时 GetErrorString(310); 我在我的单位申报- Function GetErrorString(lErrorNumber : LongInt): String;StdC
LONG lErrorNumber Error number
结果
LPTSTR Error string
但是当我在Delphi7中传递一个值时
GetErrorString(310);
我在我的单位申报-
Function GetErrorString(lErrorNumber : LongInt): String;StdCall;
implementation
Function GetErrorString;external 'Third-Party.DLL';
我收到的是空白字符串,而不是实际的错误字符串。我不知道LPTSTR的确切数据类型
同时告诉我在我的项目中使用它的正确步骤。首先,Delphi字符串是refcounted,因此不是char指针(LPTSTR)。作为初学者,我建议你避免这些陷阱,选择直指 第二个LPTSTR是指向单字节字符(LPSTR)的指针,或者是指向双字节字符(LPWSTR)的指针,具体取决于是否定义了UNICODE 因此,正确的解决方案是使函数返回PANSISCHAR或PUBCHARAR,这取决于C++程序中Unicode是如何定义的。
如果您开始在不同语言之间传递字符缓冲区,请确保它们使用相同的分配器来(取消)分配它们,或者确保每个模块释放它所做的分配。首先,一个Delphi字符串被重新计数,因此除了指向char的指针(LPTSTR)之外,还有其他内容。作为初学者,我建议你避免这些陷阱,选择直指 第二个LPTSTR是指向单字节字符(LPSTR)的指针,或者是指向双字节字符(LPWSTR)的指针,具体取决于是否定义了UNICODE 因此,正确的解决方案是使函数返回PANSISCHAR或PUBCHARAR,这取决于C++程序中Unicode是如何定义的。
如果开始在不同语言之间传递字符缓冲区,请确保它们使用相同的分配器来(取消)分配它们,或者确保每个模块释放它所进行的分配。
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
,而不记录它。所以您需要找出原因,因为它产生了很大的差异,因为cdecl
和stdcall
对于堆栈管理和参数传递有不同的语义
因此,正确的函数声明将是:
function GetErrorString(lErrorNumber: Integer): PAnsiChar; cdecl; external 'filename.dll';
或:
或:
或:
如果文档中没有明确说明这些信息,您必须进行一些研究,以确定DLL是使用Ansi还是Unicode,以及它是使用
cdecl
还是stdcall
。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
,而不记录它。所以您需要找出原因,因为它产生了很大的差异,因为cdecl
和stdcall
对于堆栈管理和参数传递有不同的语义
因此,正确的函数声明将是:
function GetErrorString(lErrorNumber: Integer): PAnsiChar; cdecl; external 'filename.dll';
或:
或:
或:
如果文档中没有明确说明该信息,您必须进行一些研究,以确定DLL是使用Ansi还是Unicode,以及它是使用cdecl
还是stdcall
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';