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

发布于 2024-08-28 13:51:14 字数 321 浏览 4 评论 0原文

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

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

DLL_EXPORT int DeviceStatus(DeviceType kind);

我希望从 Delphi 调用它。

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

I have a third-party (Win32) DLL, written in C, that exposes the following interface:

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

DLL_EXPORT int DeviceStatus(DeviceType kind);

I wish to call it from Delphi.

How do I get access to the DeviceType constants in my Delphi code? Or, if I should just use the values 1 and 2 directly, what Delphi type should I use for the "DeviceType kind" parameters? Integer? Word?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

何以心动 2024-09-04 13:51:14

在 C 中从外部 DLL 声明接口的常用方法是在 .H 头文件中公开其接口。然后,要从 C 访问 DLL,必须在 C 源代码中#include 包含 .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 ...

The usual way to declare the interface from an external DLL in C is to expose its interface in a .H header file. Then, to access the DLL from C the .H header file has to be #included in the C source code.

Translated to Delphi terms, you need to create a unit file that describes the same interface in pascal terms, translating the c syntax to pascal.

For your case, you would create a file such as...

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.

And the you would declare it in the uses clause of your source code. And invoke the function this way:

uses xyzDevice;

...

  case XyzDeviceStatus(XYZ_DEVICE_USB) of ...
烟火散人牵绊 2024-09-04 13:51:14

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

Default underlying type for enum in C++ is int (unsigned 32 bits). You need to define the same parameter type in Delphi. Regarding enumerated values, you can use hard-coded 1 and 2 values to call this function from Delphi, or use any other Delphi language feature (enum? constant? I don't know this language) which gives the same result.

明媚殇 2024-09-04 13:51:14

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

{$MINENUMSIZE 4}

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

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

Sure, you can use Integer and pass constanst directly, but it is more safe to declare function with using usual enum type. It should be like this (note "MINENUMSIZE" directive):

{$MINENUMSIZE 4}

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

function DeviceStatus(kind: TDeviceKind): Integer; stdcall; // cdecl?
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文