Проблемы с импортом C DLL в Delphi с включениями

#c #delphi #dllimport

#c #delphi #dllimport

Вопрос:

Я изучаю использование библиотеки libpostal из GitHub. Я пытаюсь использовать его с Delphi Toyoko, и я использовал утилиту headconv доктора Боба для создания следующего, но если я попытаюсь использовать ее, она жалуется на отсутствие файлов.h. Я могу найти их через Embarcadero, но, похоже, это не имеет никакого значения. Любая помощь была бы очень признательна.

Я провел некоторый поиск, но не могу найти ответ.

 unit LIBPOSTAL;
 {*************************************************************************}
{                                                                          }
{    This C DLL header file first (automatic) conversion generated by:     }
{    HeadConv 4.0 (c) 2000 by Bob Swart (aka Dr.Bob - www.drbob42.com)     }
{      Final Delphi-Jedi (Darth) command-line units edition                }
{                                                                          }
{    Generated Date: 04/04/2019                                            }
{    Generated Time: 15:01:11                                              }
{                                                                          }
{**************************************************************************}

interface
uses
{$IFDEF WIN32}
  Windows;
{$ELSE}
  Wintypes, WinProcs;
{$ENDIF}


{=> c:libpostalsrcLIBPOSTAL.H <=}

{$IFNDEF LIBPOSTAL_H}
{$DEFINE LIBPOSTAL_H}

{$IFDEF __cplusplus}
{$ENDIF}

{$INCLUDE <stdio.h>}
{$INCLUDE <stdlib.h>}
{$INCLUDE <stdint.h>}
{$INCLUDE <stdbool.h>}

{$IFDEF _WIN32}
{$IFDEF LIBPOSTAL_EXPORTS}
const
  LIBPOSTAL_EXPORT = __declspec(dllexport);
{$ELSE}
const
  LIBPOSTAL_EXPORT = __declspec(dllimport);
{$ENDIF}
{$ELSE __GNUC__ >= 4}
const
  LIBPOSTAL_EXPORT = __attribute__ ((visibility('default')));
{$ELSE}
{$DEFINE LIBPOSTAL_EXPORT}
{$ENDIF}

const
  LIBPOSTAL_MAX_LANGUAGE_LEN = 4;

const
  s = so we can duplicate the values exactly in Python;
  

Я бы ожидал, что библиотеки загрузятся, чтобы я мог использовать libpostal.dll — если это никогда не сработает таким образом, пожалуйста, дайте мне знать.

Комментарии:

1. Все это стандартные библиотеки на стороне C. Вы пробовали комментировать их, includes?

2. Черт возьми, я бы посоветовал вам прочитать мою статью о таких преобразованиях: Подводные камни преобразования . Это объясняет многое из того, что с этим не так, и как вы можете правильно конвертировать. HeadConv доктора Боба хорош, но по моему (обширному) опыту, только ручное (или вспомогательное ручное) преобразование может сделать трюк. Взгляните также на мой пакет помощника по преобразованию Conversion Pack для IDE. Я сам использую его при преобразовании заголовков.

3. Кроме того, вы можете удалить записи {$ INCLUDE <…>} и {$ IFNDEF …_H} тоже. Это необходимо в C, который использует текстовые includes, но модуль Delphi в этом не нуждается. Эти includes в любом случае являются C, поэтому Delphi не может их использовать. Кроме того, __declspec и __attribute__ материал совершенно не имеет отношения к Delphi. Вам это не нужно. Ваш const s = so we can duplicate the values exactly in Python; не имеет никакого синтаксического смысла, если только вы не имели в виду, что это строка: const s = 'so we can duplicate the values exactly in Python';

4. Кстати, чтобы протестировать свой Convertpack, я скачал и перевел libpostal.h в libpostal.pas. Результат можно найти на моей веб-странице . Обратите внимание, что это был одноразовый тест. Я не проверял, работает ли это, или если это правильно (но я предполагаю, что так, поскольку большая часть этого была выполнена ConvertPack). Если вам нужна помощь, прочитайте мою статью. Черт возьми, ConvertPack все еще нуждается в некоторых незначительных исправлениях. То, что он преобразует, является правильным, но иногда он отказывается преобразовывать допустимые конструкции. <g>

5. Черт возьми, я оставлю это на некоторое время, но если вы этого хотите, получите это сейчас. Это может исчезнуть при следующей очистке моего веб-сайта.