3

我有一个 D DLL,它由我无法控制的 C++ 程序加载。程序 LoadLibrarys 我的 DLL 并使用 GetProcAddress 找到一个名为“extension_load”的函数,该函数接受一个参数(一个指针)。在我的 D DLL 中,我有:

extern (C) int extension_load(void* ptr) {
    return 0;
}

并且这个名字需要导出为ex​​tension_load,但它被导出为ex​​tension_load@4,所以GetProcAddress 找不到它。如何在不修改名称的情况下使其成为普通的 extension_load?

4

3 回答 3

5

您需要为链接器提供重命名导出的 .def 文件。文档在这里,您需要 EXPORTS。

于 2010-12-12T17:33:21.500 回答
4

在 Hans Passant 的链接的帮助下,我得到了它的帮助。这是我的 .def 文件,供将来需要它的任何人使用(可能我自己也是):

EXETYPE NT

EXPORTS
    extension_load
    DllMain

我拥有的 .def 文件名为 dll.def。我的函数写为:

extern (C++) int extension_load(void* ptr) {

我使用的 IDE 是 D-IDE,所以要给链接器 def 文件,请转到 Project > Properties > Build Options 并键入

nameofdef.def

在额外链接参数文本框中。这假定 nameofdef.def 文件存在于您的主项目目录中以供 D-IDE 查找。

于 2010-12-12T18:08:25.913 回答
1

确实不需要def文件。只需在您的函数前面加上export,例如:

    export extern (C) int extension_load(void* ptr) {
    return 0;
}

并通过编译:dmd -ofmydll.dll mydll.d. 当然你也需要定义DllMain()

于 2011-03-19T02:00:20.530 回答