MinGW转发dll电话

时间:2016-09-25 16:08:02

标签: c++ c dll call

我正在尝试将调用从我的DLL转发到另一个DLL。我找不到任何关于如何使用MinGW的文档。

使用Visual C ++编译器我会选择:

#pragma comment (linker, "/export:DllInitialize=api.DllInitialize,@2")

或者使用.def定义文件:

EXPORTS

DllInitialize=api.DllInitialize

但是在使用MinGW32编译时,这些都不起作用。如果重要的话,我使用Code :: Blocks作为IDE。我怎么能用MinGW32做到这一点?

2 个答案:

答案 0 :(得分:1)

对不起,我在上面的代码中添加了太多的双引号。相反它应该是这样的:

asm (".section .drectve\n\t.ascii \" -export:DllInitialize=api.DllInitialize @2\"");

如果您需要多次使用它,请考虑将其放在宏中,例如

#ifdef _MSC_VER
    #define FORWARDED_EXPORT_WITH_ORDINAL(exp_name, ordinal, target_name) __pragma (comment (linker, "/export:" #exp_name "=" #target_name ",@" #ordinal))
#endif
#ifdef __GNUC__
    #define FORWARDED_EXPORT_WITH_ORDINAL(exp_name, ordinal, target_name) asm (".section .drectve\n\t.ascii \" -export:" #exp_name "= " #target_name " @" #ordinal "\"");
#endif

FORWARDED_EXPORT_WITH_ORDINAL(DllInitialize, 2, api.DllInitialize)
FORWARDED_EXPORT_WITH_ORDINAL(my_create_file_a, 100, kernel32.CreateFileA)

你明白了

答案 1 :(得分:0)

这是你如何做到的:

#ifdef _MSC_VER
    #pragma comment (linker, "/export:DllInitialize=api.DllInitialize,@2")
#endif
#ifdef __GNUC__
    asm (".section .drectve\n\t.ascii \" -export:\\\"DllInitialize=api.DllInitialize\\\" @2\"");
#endif

请注意,“drectve”不是一个拼写错误,这就是它必须如何写,但看起来有点奇怪。顺便说一句,这个奇怪的缩写是微软的想法,而不是GCC的。