2016-09-25 2 views
0

Ich versuche, Aufrufe von meiner DLL zu einer anderen DLL weiterzuleiten. Ich kann keine Dokumentation darüber finden, wie man das mit MinGW macht.MinGW Forward dll Anruf

Visual C++ Compiler Ich würde mit:

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

oder durch eine DEF-Definitionsdatei mit:

EXPORTS 

DllInitialize=api.DllInitialize 

Aber keines dieser Arbeit, wenn sie mit MinGW32 kompilieren. Ich verwende Code :: Blocks als IDE, wenn es darauf ankommt. Wie kann ich das mit MinGW32 machen?

Antwort

0

hier ist, wie Sie es tun können:

#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 

Beachten Sie, dass „drectve“ kein Tippfehler ist, das ist, wie es jedoch seltsam geschrieben werden muss, es scheinen mag. Diese seltsame Abkürzung ist übrigens eine Idee von Microsoft, nicht GCC.

1

Es tut mir leid, ich habe ein bisschen zu viele doppelte Anführungszeichen im obigen Code hinzugefügt. Stattdessen sollte es so sein:

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

Wenn Sie es oft verwenden müssen, ziehen Sie es in ein Makro, z.

#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) 

Sie bekommen die Idee