2010-07-05 7 views
1

Récemment, j'ai essayé d'ajouter des tests unitaires à un binaire existant en créant un point d'entrée supplémentaire (DLLMain) à une application qui a déjà un point d'entrée principal (c'est un exe de console). L'application a semblé compiler correctement bien que je n'ai pas pu l'utiliser comme DLL à partir de mon framework de test d'unité python, toutes les tentatives d'utilisation de l'exe en tant que DLL ont échoué.Plusieurs points d'entrée d'application

Est-ce que quelqu'un a des idées ou de l'expérience dans l'ajout d'un point d'entrée d'application supplémentaire avec n'importe quelle entrée pour expliquer pourquoi cela fonctionnerait ou non?

Répondre

3

Il y a quelques problèmes que vous devez résoudre pour mettre en œuvre ce que vous voulez:

  • L'exe doit avoir table de déplacement (utilisation interrupteur de liaison/FIXE: NO)
  • L'exe doit les exportations au moins une fonction - Il est clair comment faire cela.

Je recommande d'utiliser DUMPBIN.EXE sans certains commutateurs (/ headers,/exports et sans commutateurs) pour examiner les en-têtes exe. Vous pouvez comparer la structure de votre application avec Winword.exe ou outlook.exe qui exporte certaines fonctions.

Si tout cela ne va pas aider, je vais essayer d'écrire une application de test EXE qui peut être chargée en tant qu'exe et afficher le code ici.

MISE À JOUR: Tout à fait vérifié ma suggestion. Ça marche. Fichier Loadable.c ressemble suivant

#include <windows.h> 
#include <stdio.h> 

EXTERN_C int __declspec(dllexport) WINAPI Sum (int x, int y); 

EXTERN_C int __declspec(dllexport) WINAPI Sum (int x, int y) 
{ 
    return x + y; 
} 

int main() 
{ 
    printf ("2+3=%d\n", Sum(2,3)); 
} 

Le seul commutateur de liaison important est /FIXED:NO que l'on peut trouver en partie avancée des paramètres de liaison. Le programme peut fonctionner et produire la sortie "2+3=5".

Un autre EXE chargé le fichier EXE comme DLL et appelle la fonction Sum:

#include <windows.h> 
#include <stdio.h> 

typedef int (WINAPI *PFN_SUM) (int x, int y); 

int main() 
{ 
    HMODULE hModule = LoadLibrary (TEXT("C:\\Oleg\\ExeAsDll\\Loadable.exe")); 
    PFN_SUM fnSum = (PFN_SUM) GetProcAddress (hModule, "[email protected]"); 
    int res = fnSum (5,4); 
    printf ("5+4=%d\n", res); 
    return 0; 
} 

Le programme peut également exécuter et produit la sortie "5+4=9".

1

Je ne sais pas avec certitude, mais je suppose que Windows refuse tout simplement de charger un EXE en cours de processus et une DLL comme un nouveau processus, simple et simple.

Ces questions semblent contenir plus de détails:

La façon la plus simple d'obtenir les deux comportements dans une image exécutable est à concevoir comme une DLL, utilisez rundll32.exe pour l'exécuter de manière autonome. Il n'y a pas besoin d'écrire votre propre enveloppe.

Questions connexes