Вызов функции C в DLL с параметрами перечисления из Delphi - PullRequest
4 голосов
/ 15 апреля 2010

У меня есть сторонняя (Win32) DLL, написанная на C, которая предоставляет следующий интерфейс:

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

DLL_EXPORT int DeviceStatus(DeviceType kind);

Я хочу позвонить из Delphi.

Как мне получить доступ к константам DeviceType в моем Delphi-коде? Или, если мне просто нужно использовать значения 1 и 2 напрямую, какой тип Delphi я должен использовать для параметров типа DeviceType? Integer? Слово

Ответы [ 3 ]

6 голосов
/ 15 апреля 2010

Обычный способ объявить интерфейс из внешней DLL в C - это представить его интерфейс в заголовочном файле .H. Затем для доступа к DLL из C заголовочный файл .H должен быть #include d в исходном коде C.

В переводе на термины Delphi необходимо создать файл модуля, который описывает тот же интерфейс в терминах паскаля, переводя синтаксис c в паскаль.

Для вашего случая вы должны создать файл, такой как ...

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 голосов
/ 15 апреля 2010

Базовым типом по умолчанию для enum в C ++ является int (беззнаковые 32 бита). Вам нужно определить тот же тип параметра в Delphi. Что касается перечисляемых значений, вы можете использовать жестко запрограммированные значения 1 и 2 для вызова этой функции из Delphi или использовать любую другую функцию языка Delphi (enum? Constant? Я не знаю этот язык), которая дает тот же результат.

1 голос
/ 15 апреля 2010

Конечно, вы можете использовать Integer и передавать constanst напрямую, но более безопасно объявить функцию с использованием обычного типа enum. Должно быть так (обратите внимание на директиву MINENUMSIZE):

{$MINENUMSIZE 4}

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

function DeviceStatus(kind: TDeviceKind): Integer; stdcall; // cdecl?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...