使用Delphi中的enum参数调用DLL中的C函数

时间:2010-04-15 07:05:55

标签: 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,我应该使用什么Delphi类型的“DeviceType类型”参数?整数?字?

3 个答案:

答案 0 :(得分:6)

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

翻译成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 ...

答案 1 :(得分:2)

C ++中枚举的默认基础类型是int(无符号32位)。您需要在Delphi中定义相同的参数类型。关于枚举值,您可以使用硬编码的1和2值从Delphi调用此函数,或使用任何其他Delphi语言功能(枚举?常量?我不知道这种语言),它会产生相同的结果。

答案 2 :(得分:1)

当然,您可以使用Integer并直接传递常量,但使用常用的枚举类型声明函数更安全。它应该是这样的(注意“MINIMUM SIZE”指令):

{$MINENUMSIZE 4}

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

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