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

标签 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
结果: 错误 43:不是有效的库文件。


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
结果: 错误 42:符号未定义 _bbBeginBlitz3D@0 错误 42:符号未定义 _bbEndBlitz3D@0


任何关于如何使用此 dll 的想法或任何有用的最新在线指南将不胜感激。我已经有一段时间没有摆弄 native 代码和共享库等了。

最佳答案

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

export 用于从 DLL 导出函数,而不是导入它们。

关于windows - 在 D 中使用 Windows dll 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479355/

相关文章:

c++ - 有没有办法为 RIOT OS 添加新的语言支持(例如 D)?

unit-testing - 单元测试D库

windows - 有没有像PeekMessage这样不处理消息的函数?

windows - MFC .dll 调试断言

c++ - 如何在应用程序通过任务管理器被杀死时保存数据?

c++ - 头文件中定义的const float**

c++ - 避免在 C++ 库中使用全局对象

Windows下C程序访问总线上的内容

c++ - 如何找出依赖于 LIB 文件的 DLL 列表?

pointers - D: 似乎无法创建一个 std.container.Array of const struct pointers