Delphi的64位DLL c/c++接口



我有一个.h文件,我需要将其翻译成Delphi,以调用用C/C++编写的DLL接口。

在32位中,一切都很顺利,我可以将DLL与Delphi应用程序一起使用,没有任何问题。

在64位中,它不能很好地工作。

我没有写这个DLL接口,它来自做硬件的第三方。

namespace gXusb {

typedef int            INTEGER;
typedef short          INT16;
typedef unsigned       CARDINAL;
typedef unsigned char  CARD8;
typedef float          REAL;
typedef double         LONGREAL;
typedef char           CHAR;
typedef unsigned char  BOOLEAN;
typedef void *         ADDRESS;

struct CCamera;

extern "C" EXPORT_ void __cdecl Enumerate( void (__cdecl *CallbackProc)(CARDINAL) );
extern "C" EXPORT_ CCamera *__cdecl Initialize( CARDINAL Id );

Cardinal在64位以下仍然是32位无符号的吗?

我不太确定这种声明函数类型的方式,以及它对64位编译的作用:

void (__cdecl *CallbackProc)(CARDINAL)

它看起来有点笨重。

让我困惑的是:

typedef unsigned       CARDINAL;

我已经发现这是32位DLL的32位,但它在64位DLL下保持32位吗?

以下内容在32位和64位中都可以正常工作:

unit gXusb;
interface
type
// prefixing types that Delphi already declares...
_INTEGER = Int32;
_INT16 = Int16;
_CARDINAL = UInt32;
CARD8 = UInt8;
_REAL = Single;
LONGREAL = Double;
_CHAR = AnsiChar;
_BOOLEAN = ByteBool;
ADDRESS = Pointer;
CCamera = record end;
PCCamera = ^CCamera;
UsbEnumCallback = procedure(Param: _CARDINAL); cdecl;
procedure Enumerate(Cb: UsbEnumCallback); cdecl;
function Initialize(Id: _CARDINAL): PCCamera; cdecl;
implementation
const
TheDLLName = 'the.dll';
procedure Enumerate; external TheDLLName;
function Initialize; external TheDLLName;
end.

就我个人而言,我会去掉任何不是严格必要的类型别名,使用本地Delphi类型是合适的,例如:

unit gXusb;
interface
type
CARD8 = UInt8;
CCamera = record end;
PCCamera = ^CCamera;
UsbEnumCallback = procedure(Param: UInt32); cdecl;
procedure Enumerate(Cb: UsbEnumCallback); cdecl;
function Initialize(Id: UInt32): PCCamera; cdecl;
implementation
const
TheDLLName = 'the.dll';
procedure Enumerate; external TheDLLName;
function Initialize; external TheDLLName;
end.

最新更新