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

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

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

论据

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';