访问不调用Delphi中指定的约定而声明的c++函数

Access C++ function declared without calling convention specified from Delphi

本文关键字:约定 c++ 函数 声明 调用 Delphi 访问      更新时间:2023-10-16

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

您的MW_ListReaders()函数声明不正确。

C/c++在没有指定呼叫约定时,默认的呼叫约定是__cdecl,而不是__stdcall

MW_ListReaders()返回一个指向宽char(这将是Delphi中的PPWideChar)的指针的指针,但是您已经声明它返回一个指向宽char (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。如果您使用的是旧版本,或者只是为了良好的实践,您可以(而且应该)使用Windows单元中的ULONGULONG32类型(以及其他类型)来保持与原始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'

我认为_ULONG对应于32位无符号整数类型(至少对于MS编译器)。
注意使用PPWideChar作为结果类型。

编辑:调用约定更改为cdecl,默认的,正如David Heffernan注意到的。

function MW_ListReaders(Context: Cardinal; var NumberOfReaders : integer): PPWideChar; cdecl;
function MW_Connect(Context: Cardinal; ReaderName: PWideChar): Cardinal; cdecl;