我尝试使用一个DLL,它的两个函数是:
__declspec(dllexport) LPCWSTR* MW_ListReaders(_ULONG Context, int* NumberOfReaders);
__declspec(dllexport) _ULONG MW_Connect(_ULONG Context, LPCWSTR ReaderName);
为了与Delphi一起使用,以及对于MW_ListReaders函数,我做了以下声明
function MW_ListReaders(Context : int64; var NumberOfReaders : integer) : PWideChar; stdcall;
在C ++中不太了解,此外,指针,我迷失了。
如何在Delphi中使用这两个函数?
答案 0 :(得分:3)
您的MW_ListReaders()
函数声明不正确。
当没有指定调用约定时,C / C ++中的默认调用约定是__cdecl
,而不是__stdcall
。
MW_ListReaders()
返回一个指向指向宽字符的指针(在Delphi中为PPWideChar
),但是你已声明它返回指向宽字符(PWideChar
)的指针。
ULONG
是32位无符号整数,而不是64位有符号整数。
请改为尝试:
function MW_ListReaders(Context: UInt32; var NumberOfReaders: Integer): PPWideChar; cdecl; external 'filename.dll';
function MW_Connect(Context: UInt32; const ReaderName: PWideChar): UInt32; cdecl; external 'filename.dll'
在Delphi 2009中添加了 UInt32
。如果您使用的是旧版本,或者只是为了一般的良好实践,您可以(并且应该)使用ULONG
或ULONG32
类型(和其他类型)在Windows
单元中,而不是保持与原始C / C ++声明的兼容性:
uses
..., Windows;
type
PLPCWSTR = ^LPCWSTR;
function MW_ListReaders(Context: ULONG; var NumberOfReaders: Integer): PLPCWSTR; cdecl; external 'filename.dll';
function MW_Connect(Context: ULONG; ReaderName: LPCWSTR): ULONG; cdecl; external 'filename.dll'
答案 1 :(得分:2)
我认为_ULONG
对应32位无符号整数类型(至少for MS compilers)。
并注意使用 P PWideChar作为结果类型。
编辑:调用约定更改为cdecl,默认值为,正如David Heffernan注意到的那样。
function MW_ListReaders(Context: Cardinal; var NumberOfReaders : integer): PPWideChar; cdecl;
function MW_Connect(Context: Cardinal; ReaderName: PWideChar): Cardinal; cdecl;