在D中使用windows dll的正确方法?

时间:2011-12-12 18:55:18

标签: windows dll d

我有一个小dll,我想用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 个答案:

答案 0 :(得分:5)

库文件可能是COFF格式。使用coffimplib将其转换为可与D的链接器一起使用的OMF库,或implib从DLL创建导入库。

从DLL导出函数时使用

export,而不是导入它们。

答案 1 :(得分:0)

按照Cyber​​Shadow的建议,我使用coffimplib工具将blitz3dsdk.lib文件转换为OMF格式并使用编译指示导入。然后我在extern (C)块中定义了它包含的外部函数。

示例:

pragma(lib, "new.lib");

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

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

    return 0;
}

我已经尝试了这个dll中的一些函数,遵循this page的指南来转换某些类型等,并且一切都很好。