2010-04-15 62 views
4

枚举参数的DLL我有一个第三方的(Win32)DLL,用C写的,暴露出以下接口:调用C函数与德尔福

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

DLL_EXPORT int DeviceStatus(DeviceType kind); 

我想从德尔福调用它。

如何在Delphi代码中访问DeviceType常量?或者,如果我直接使用值1和2,那么我应该使用什么类型的“DeviceType kind”参数?整数?字?

回答

6

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

翻译为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 ... 
2

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

+1

如果你想使用它作为一个枚举你必须使用{$ MINENUMSIZE 4}指令 – Remko 2010-04-15 07:43:21

1

当然,你可以使用整数和constanst直接传递,但它是更安全的使用通常的枚举类型来声明功能。它应该是这样的(注“MINENUMSIZE”指令):

{$MINENUMSIZE 4} 

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

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

不幸的是,这是错误的enumsize设置为4,如写入'DEVICE_PCI'将等于0,而不是1.您需要为值0插入一个类似'DEVICE_UNKNOWN'的虚拟元素,或者将值1赋予第一个枚举。 – mghie 2010-04-15 09:34:31

+2

@mghie很好发现。最好的方法是使用Delphi 6中添加的类型TDeviceKind =(DEVICE_PCI = 1,DEVICE_USB = 2)语法?请参阅http://docwiki.embarcadero.com/RADStudio/en/Simple_Types#Enumerated_Types_with_Explicitly_Assigned_Ordinality – 2010-04-15 09:53:54

+0

糟糕。我一定还在睡觉。固定。 – Alex 2010-04-15 10:06:14