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

时间:2021-06-12 17:14:57

标签: c++ delphi

我有一个 // hSnapshot is valid, and I already called "Module32First" - this loops through any other modules while(this.moduleBaseAddr == null && this.moduleHandle == null) { Tlhelp32.MODULEENTRY32W currentModuleEntry32 = new Tlhelp32.MODULEENTRY32W(); if(this.kernel32.Module32Next(hSnapshot, currentModuleEntry32)) { currentModuleEntry32.read(); String currentModuleName = currentModuleEntry32.szModule(); System.out.println(currentModuleName + ": " + currentModuleEntry32.szModule()); if(currentModuleName.equals(MODULE_NAME)) { this.moduleBaseAddr = currentModuleEntry32.modBaseAddr; this.moduleHandle = currentModuleEntry32.hModule.getPointer(); break; } }else{ break; } } 文件,我需要将其转换为 Delphi,以调用用 C/C++ 编写的 DLL 接口。

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

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

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

.h

在 64 位下 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 ); 仍然是 32 位无符号吗?

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

Cardinal

看起来有点麻烦。

令我困惑的是:

void (__cdecl *CallbackProc)(CARDINAL)

我发现对于 32 位 DLL 来说这是 32 位,但是在 64 位 DLL 下它是否保持 32 位?

1 个答案:

答案 0 :(得分:0)

类似以下内容在 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.
相关问题