我有一个由我无法控制的C ++程序加载的D DLL。程序LoadLibrarys我的DLL并使用GetProcAddress查找名为“extension_load”的函数,该函数接受一个参数(一个指针)。在我的D DLL中,我有:
extern (C) int extension_load(void* ptr) {
return 0;
}
此名称需要导出为extension_load,但它将作为extension_load @ 4导出,因此GetProcAddress无法找到它。如何在没有名称mangling的情况下使其成为普通的extension_load?
答案 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
。