使用Delphi中的枚举参数在DLL中调用C函数

使用Delphi中的枚举参数在DLL中调用C函数,delphi,dll,enums,Delphi,Dll,Enums,我有一个用C编写的第三方Win32 DLL,它公开了以下接口: DLL_EXPORT typedef enum { DEVICE_PCI = 1, DEVICE_USB = 2 } DeviceType; DLL_EXPORT int DeviceStatus(DeviceType kind); 我想从德尔福叫它 如何访问Delphi代码中的DeviceType常量?或者,如果我应该直接使用值1和2,我应该为DeviceType类参数使用什么Delphi类型?整数Word?< /p>

我有一个用C编写的第三方Win32 DLL,它公开了以下接口:

DLL_EXPORT typedef enum
{
  DEVICE_PCI = 1,
  DEVICE_USB = 2
} DeviceType;

DLL_EXPORT int DeviceStatus(DeviceType kind);
我想从德尔福叫它


如何访问Delphi代码中的DeviceType常量?或者,如果我应该直接使用值1和2,我应该为DeviceType类参数使用什么Delphi类型?整数Word?< /p> C++中枚举的默认基础类型是int未签名的32位。您需要在Delphi中定义相同的参数类型。关于枚举值,您可以使用硬编码的1和2值从Delphi调用此函数,或者使用任何其他Delphi语言功能enum?常数我不知道这种语言会给出相同的结果。

在C中从外部DLL声明接口的通常方法是在.H头文件中公开其接口。然后,要从C访问DLL,C源代码中必须包含.H头文件

翻译成Delphi术语后,您需要创建一个用pascal术语描述相同接口的单元文件,将c语法翻译成pascal

对于您的情况,您将创建一个文件,例如

unit xyzDevice;
{ XYZ device Delphi interface unit 
  translated from xyz.h by xxxxx --  Copyright (c) 2009 xxxxx
  Delphi API to libXYZ - The Free XYZ device library --- Copyright (C) 2006 yyyyy  }

interface

type
  TXyzDeviceType = integer;

const
  xyzDll = 'xyz.dll';
  XYZ_DEVICE_PCI = 1;
  XYZ_DEVICE_USB = 2;

function XyzDeviceStatus ( kind : TXyzDeviceType ) : integer; stdcall; 
   external xyzDLL; name 'DeviceStatus';

implementation
end.
您可以在源代码的uses子句中声明它。并以这种方式调用函数:

uses xyzDevice;

...

  case XyzDeviceStatus(XYZ_DEVICE_USB) of ...

当然,您可以使用Integer并直接传递constanst,但使用常用的枚举类型声明函数更安全。它应该类似于以下注释MINENUMSIZE指令:

{$MINENUMSIZE 4}

type
  TDeviceKind = (DEVICE_PCI = 1, DEVICE_USB = 2);

function DeviceStatus(kind: TDeviceKind): Integer; stdcall; // cdecl?

如果要将其用作枚举,必须使用{$MINENUMSIZE 4}方向将enumsize设置为4。不幸的是,这是错误的,因为写入的设备_PCI将等于0,而不是1。您需要为值0插入一个类似设备_UNKNOWN的伪值,或将值1赋给第一个枚举。@mghie发现得很好。最好的方法是使用Delphi6中添加的`typeTDeviceKind=DEVICE\uPCI=1,DEVICE\uUSB=2`语法?请看Oops。我肯定还在睡觉。固定的