Правильный способ использования Windows DLL в D? - PullRequest
3 голосов
/ 12 декабря 2011

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

  • b3d.dll
  • blitz3dsdk.exp
  • blitz3dsdk.lib
  • blitz3dsdk.h

Вот что я пытался заставить D использовать эту dll.


test.d

pragma(lib, "blitz3dsdk.lib");

int main(string[] Args)
{
    bbBeginBlitz3D();
    bbEndBlitz3D();

    return 0;
}

Компиляция: dmd test.d -w -wi -debug
Результат: Error 43: Not a Valid Library File.


Blitz3DSDK.d

module Blitz3DSDK;

// __declspec(dllimport) int bbBeginBlitz3D() - from the header file.
export extern (Windows) int bbBeginBlitz3D();

// __declspec(dllimport) void bbEndBlitz3D() - from the header file.
export extern (Windows) void bbEndBlitz3D();

test.d

import Blitz3DSDK;

int main(string[] Args)
{
    bbBeginBlitz3D();
    bbEndBlitz3D();

    return 0;
}

Компиляция: dmd test.d -w -wi -debug
Результат: Error 42: Symbol Undefined _bbBeginBlitz3D@0 Error 42: Symbol Undefined _bbEndBlitz3D@0


Любые идеи, как использовать эту DLL или любуюПолезные обновленные онлайн руководства будут оценены.Прошло много времени с тех пор, как я возился с собственным кодом, общими библиотеками и т. Д.

Ответы [ 2 ]

5 голосов
/ 13 декабря 2011

Файл библиотеки, вероятно, в формате COFF. Используйте coffimplib, чтобы преобразовать его в библиотеку OMF, используемую с компоновщиком D, или implib, чтобы создать библиотеку импорта из DLL.

export используется при экспорте функций из DLL, а не для их импорта.

0 голосов
/ 13 декабря 2011

Следуя советам CyberShadow, я использовал инструмент coffimplib для преобразования файла blitz3dsdk.lib в формат OMF и импортировал его с помощью прагмы. Затем я определил внешние функции, которые он содержит внутри блока extern (C).

Пример:

pragma(lib, "new.lib");

extern (C)
{
    int bbBeginBlitz3D();
    void bbEndBlitz3D();
}

int main(string[] Args)
{
    bbBeginBlitz3D();
    bbEndBlitz3D();

    return 0;
}

Я пробовал это с несколькими дополнительными функциями из этой библиотеки, следуя указаниям этой страницы для преобразования некоторых типов и т. Д., И все прекрасно работает.

...