2016-09-25 174 views
0

我試圖將來自我的DLL的調用轉發給另一個DLL。我找不到任何關於如何使用MinGW來做到這一點的文檔。MinGW Forward dll調用

使用Visual C++編譯器,我會去用:

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

或使用.DEF定義文件:

EXPORTS 

DllInitialize=api.DllInitialize 

但是,這些工作與MINGW32編譯時。如果它很重要,我使用Code :: Blocks作爲IDE。我怎樣才能用MinGW32做到這一點?

回答

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的。

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) 

你的想法