导出的函数符号名称重整

时间:2010-12-12 17:00:20

标签: dll export d name-mangling

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

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

此名称需要导出为ex​​tension_load,但它将作为extension_load @ 4导出,因此GetProcAddress无法找到它。如何在没有名称mangling的情况下使其成为普通的extension_load?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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>属性>构建选项并输入

nameofdef.def
链接参数文本框中的

。这假定nameofdef.def文件存在于主项目目录中,供D-IDE查找。

答案 2 :(得分:1)

确实不需要def文件。只需在export之前添加您的功能,例如:

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

通过以下方式编译:{{1​​}}。当然,您还需要定义dmd -ofmydll.dll mydll.d