导出的函数符号名称修改

发布于 2024-10-07 09:30:16 字数 336 浏览 9 评论 0原文

我有一个 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 而不需要名称修改?

I have a D DLL that is being loaded by a C++ program that I have no control over. The program LoadLibrarys my DLL and uses GetProcAddress to find a function named "extension_load" that takes one argument (a pointer). In my D DLL I have:

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

And this name needs to be exported as extension_load but it is being exported as extension_load@4, so GetProcAddress cannot find it. How do I make it plain extension_load without the name mangling?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦罢 2024-10-14 09:30:16

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

You'll need to provide the linker with a .def file that renames the export. Docs are here, you need EXPORTS.

会傲 2024-10-14 09:30:16

我在汉斯·帕桑特链接的帮助下得到了它。这是我的 .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 查找。

I got it working with some help from Hans Passant's link. Here is my .def file for anyone who will need it in the future (probably myself too):

EXETYPE NT

EXPORTS
    extension_load
    DllMain

The .def file I have is named dll.def. I have the function written as:

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

and the IDE I use is D-IDE, so to give the linker the def file, go to Project > Properties > Build Options and type

nameofdef.def

in the Extra Linking arguments text box. This assumes that the nameofdef.def file exists in your main project directory for D-IDE to find.

一曲爱恨情仇 2024-10-14 09:30:16

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

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

并通过:dmd -ofmydll.dll mydll.d 进行编译。当然,您还需要定义DllMain()

There is really no need for a def file. Just prepend your functions with export, e.g.:

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

And compile via: dmd -ofmydll.dll mydll.d. Of course you'll need to define DllMain() as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文