Как включить директиву C / C ++ #defined в процесс внешнего вызова Delphi - PullRequest
0 голосов
/ 31 августа 2018

У меня есть скомпилированный Cll C / C ++ VS и библиотека Delphi, созданная из h-файла C / C ++. H-файл имеет макроопределенные директивы. Во все внешние вызовы C / C ++ и вызовы typedef включена директива DISPLAY_CALL.

При преобразовании в Delphi я исключил директиву DISPLAY_CALL, так как она не соответствовала моему преобразованию Delphi. Большая часть функций DLL работает отлично, за исключением определенных функций и вызовов типов, где DLL использует директиву DISPLAY_CALL, чтобы определить, это платформа Windows или нет и будет возвращать ошибку, если вызывается на другой платформе (игнорируется в DLL). Однако, если DISPLAY_CALL исключен, то на любой платформе получена ошибка, поэтому директива DISPLAY_CALL должна быть принята DLL. Компиляция C ++ с Visual Studio подтверждает эту ошибку, если исключить директиву DISPLAY_CALL.

Я использую Tokyo 10.2.3 Enterprise.

Я искал, как это сделать без успеха.

Итак, как вы включаете эту директиву DISPLAY_CALL в процесс внешнего вызова Delphi. Я столкнулся с зависимостью, но я не уверен, что это правильное направление.

Ниже приведен фрагмент кода C / C ++ и текущего переведенного кода Delphi.

C / C ++ код

#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
#define DISPLAY_CALL WINAPI
#else
#define DISPLAY_CALL
#endif

#ifdef __cplusplus
extern "C"{
#endif

typedef void (DISPLAY_CALL *display_removed_cb)(int fd, void *user_data);

int DISPLAY_CALL display_get_device(display_device_handle *dev_handle);

Delphi код

const
DisplayName =  'display.dll';  //defined for windows stdcall

 type
  display_removed_cb = procedure(fd:integer; user_data:pointer);

function display_get_device (dev_handle:pdisplay_device_handle): integer; stdcall; external DisplayName name 'display_get_device';

Я с нетерпением жду каких-то превосходных знаний по этому вопросу.

1 Ответ

0 голосов
/ 31 августа 2018

Фактически, код C ++ говорит, что stdcall должен использоваться в Windows, а соглашение о вызовах по умолчанию (неизменно cdecl) - в других местах.

Ваш вопрос имеет длинную точку зрения о том, что вы думаете DISPLAY_CALL используется для этого, боюсь, я не могу понять. Я думаю, что вы слишком обдумали это и немного запутались. Это действительно не что иное, как спецификация соглашения о вызовах.

Итак, в вашем Delphi-коде вы должны сделать что-то вроде этого:

function display_get_device(dev_handle:pdisplay_device_handle): integer; 
  {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  external DisplayName name 'display_get_device';

Предполагается, что вы хотите поддерживать платформы, отличные от Windows. Если нет, и вы поддерживаете только Windows, тогда вы можете просто безоговорочно использовать stdcall.

Вы также должны указывать соглашение о вызовах везде, и ваш код Delphi не может этого сделать. Вы пропустили это по типу обратного вызова. Это должно быть:

type
  display_removed_cb = procedure(fd:integer; user_data:pointer); 
  {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}

И, очевидно, всякий раз, когда вы объявляете функцию, которая будет передана в качестве аргумента display_removed_cb, вы также должны указать соответствующее соглашение о вызовах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...