2013-03-08 3 views
1

Quelqu'un peut-il me dire ce que je fais mal? J'essaie d'exécuter une main personnalisée sur un thread différent.laisser une DLL appeler une fonction exe avec le pointeur de fonction

Ceci est le code.

Exe
main.cpp

#include "dll_class.h" 
#include <iostream> 
int main(void); 
DllClass object(main); 
int main(void) 
{ 
    std::cout << "Enter the main code.\n"; 
    std::getchar(); 
} 

dll
dll_class.h

#include "platform.h" 
#include <iostream> 
class DLL_API DllClass //DLL_API is just a macro for import and export. 
{ 
public: 
    DllClass(int(*main)(void)) 
    { 
     std::cout << "Start application.\n"; 
     platform = new Platform(main); 
    } 
    ~DllClass(void) 
    { 
     delete platform; 
    } 
private: 
    Platform* platform; 
}; 

platform.h

class DLL_API Platform 
{ 
public: 
    Platform(main_t main_tp); 
    ~Platform(void){} 
}; 

platform.cpp

#include "platform.h" 
#include "Windows.h" 
#include <iostream> 

HHOOK hookHandle; 
int(*main_p)(void);//This will hold a the main function of the the .exe. 
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam); 

DWORD WINAPI callMain(_In_ LPVOID lpParameter) 
{ 
    std::cout << "Calling the main function.\n"; 
    main_p(); 
    return 0; 
} 

Platform::Platform(int(*main_tp)(void)) 
{ 
    main_p = main_tp; 
    CreateThread(NULL, 0, callMain, NULL, 0, NULL); 
    std::cout << "Setting hooks.\n"; 
    hookHandle = SetWindowsHookEx(WH_MOUSE_LL, keyHandler, NULL, 0); 
    std::cout << "Enter message loop.\n"; 
    MSG message; 
    while(GetMessage(&message, (HWND)-1, 0, 0) != 0){ 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 
} 

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    std::cout << "Inside the hook function.\n" << std::endl; 
    return CallNextHookEx(hookHandle, nCode, wParam, lParam); 
} 

Il fonctionne très bien, jusqu'à un certain moment. Ceci est la sortie.

Start application. 
Setting hooks. 
Calling the main function. 
Enter message loop. 
Inside the hook function. (A lot of times of course). 

mais il ne dit jamais:

Enter the main code. 

Est-il impossible de laisser dll appeler une fonction exe?

+2

Votre constructeur de plate-forme n'est pas encore retourné. 'main' ne peut pas s'exécuter tant que les objets ne sont pas construits et que votre constructeur n'est pas encore fini. –

Répondre

2

Il est très POSSIBLE d'appeler une fonction dans le fichier exécutable à partir d'une bibliothèque partagée. Cependant, la norme C, comme mentionné dans l'autre réponse, ne vous permet pas d'appeler le main. Cela a à voir avec le fait que le runtime C [pour se prémunir des linguistes: insérer "parfois" ici] repose sur un certain ordre de choses, et si vous essayez d'appeler main avant que l'exécution C ait fait l'initialisation correcte AVANT main , vous avez des problèmes.

Si votre but est de subvertir ce que fait main, alors vous devrez trouver une autre façon d'y parvenir - au moins si vous vous attendez à ce qu'il fonctionne pour plus d'un exécutable particulier.

+0

Je pense que c'est une question complètement différente - et je ne suis pas tout à fait sûr que j'ai) de comprendre complètement la question ou b) connaître la réponse. Évidemment, quand on produit quelque chose comme .NET, c'est un processus assez complexe, et je ne peux pas dire que je sais ce que ça fait ... Le "processus de démarrage" .NET est probablement un emballage pour autre chose - mais c'est une conjecture , pas de connaissances. –

+0

Désolé ma question n'était pas terminée. D'une certaine manière, il l'a posté. – JMRC

+0

Merci, j'essaie de créer une couche autour de WinAPI et .NET. J'ai remarqué quand la principale d'une application .NET revient, elle va plus loin dans les niveaux inférieurs. Le principal est un fil lui-même, n'est-ce pas? J'essayais de créer le même effet. Je veux m'assurer que les hooks sont définis et que la boucle de messages est en cours d'exécution avant que l'utilisateur appelle Main. Y a-t-il une alternative? Si je crée une main personnalisée comme 'my_main', puis-je m'assurer qu'ils n'ont pas à appeler à la fois main et' my_main'? – JMRC

1

La norme C++ ne permet pas d'appeler main() ou de prendre son adresse, ce que vous faites ici. Voir this fil qui cite la ligne et le verset. Donc, ce que vous faites est indéfini.

Questions connexes