在没有调用Delphi指定的约定的情况下声明的C ++函数

时间:2015-08-11 17:11:19

标签: c++ delphi

我尝试使用一个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中使用这两个函数?

2 个答案:

答案 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。如果您使用的是旧版本,或者只是为了一般的良好实践,您可以(并且应该)使用ULONGULONG32类型(和其他类型)在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;
相关问题