访问不调用Delphi中指定的约定而声明的c++函数
Access C++ function declared without calling convention specified from 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中使用这两个函数?
您的MW_ListReaders()
函数声明不正确。
C/c++在没有指定呼叫约定时,默认的呼叫约定是__cdecl
,而不是__stdcall
。
试试这个: MW_ListReaders()
返回一个指向宽char(这将是Delphi中的PPWideChar
)的指针的指针,但是您已经声明它返回一个指向宽char (PWideChar
)的指针。ULONG
是32位无符号整数,而不是64位有符号整数。
在Delphi 2009中增加了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'
UInt32
。如果您使用的是旧版本,或者只是为了良好的实践,您可以(而且应该)使用Windows
单元中的ULONG
或ULONG32
类型(以及其他类型)来保持与原始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;
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 为什么在 x64 中忽略__stdcall调用约定?
- 引发异常的方法的命名约定 (C++)?
- 窗口调用约定
- 我应该提到纯虚函数中的调用约定吗?
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 如何使用gcc指定stdcall调用约定
- Clang:x86 FPU调用约定
- 该标准是否说明了例外和不同调用约定的共存
- Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
- std::sort & comp - 调用约定?
- C++命名空间约定
- C++的新手试图弄清楚类约定
- 如何为类 /块 /范围选择C 调用约定
- C 未知呼叫约定
- C++关于传递对象(指针与引用)的约定
- DLL 的"good"调用约定是什么?
- 结构中重载运算符的调用约定
- 一些编码约定/标准实践问题
- 'ShowSUM':__declspec(dllexport)不能应用于具有__clrcall调用约定的函数