2010-12-13 10 views
1

J'utilise VS2008 pour le code de port de VC6. Quand j'ai couru la nouvelle application de construction, je reçois cette erreur "R6031 Attemp pour initialiser le CRT plus d'une fois.Cela indique un bug dans votre application".Tentative d'initialisation du CRT plus d'une fois

Il y a un total de 21 dll qui impliquent dans la construction de cette application. Certaines DLL contiennent des fichiers .c et appellent explicitement _CRT_INIT() dans DllMain. code ci-dessous:

BOOL APIENTRY DllMain (HANDLE hModule, DWORD dwReason, LPVOID lpReserved) 
{ 
switch(dwReason) 
{ 
    case DLL_PROCESS_ATTACH: 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 

     if(!_CRT_INIT(hModule, dwReason, lpReserved)) 
    return FALSE; 

    break; 
} 

return TRUE; 
} 

Je ne sais pas comment résoudre ce problème. Ai-je besoin de commenter l'appel à _CRT_INIT()?

Merci d'avance.

Répondre

3

Oui, vous ne devriez pas avoir besoin d'appeler _CRT_INIT() explicitement. Il est probablement appelé par l'un ou l'autre DLLMain. Pour plus de détails, voir MSDN pour plus de détails.

Modifier

Je pense que vous avez mal lu MSDN:

Lors de la construction d'une DLL qui utilise l'un des les bibliothèques d'exécution C, afin de assurer que le CRT est correctement initialisé, soit

  1. la fonction d'initialisation doit être nommée DllMain() et le point d'entrée doit être spécifiée avec l'option de liaison -entrée: _DllMainCRTStartup @ 12 - ou -

Vous ont nommé la fonction init DllMain(), donc _CRT_INIT()est être appelé automatiquement. Je pense. Pourquoi ne pas simplement commenter cette ligne et voir ce qui se passe?

+0

MSDN dit que le point d'entrée de la DLL doit explicitement appelez CRT_INIT() sur le processus attach et detache le processus – ramrocket

+0

En 15 ans de programmation Win32, je n'ai jamais eu besoin d'initialiser explicitement le CRT dans DllMain. Je suis d'accord avec la réponse d'Egrunin. –

0

This error code est spécifique aux assemblages en mode mixte. Avez-vous activé le CLR pendant le port par erreur? Vous ne devriez pas voir ceci pendant un port simple de VC6 à une révision ultérieure de Visual C++.

Ce diagnostic indique que les instructions MSIL exécutaient pendant verrouillage du chargeur. Pour plus d'informations, voir Initialisation d'assemblages mixtes.

Vous pouvez vérifier le réglage du projet par un clic droit sur le projet dans l'Explorateur de solutions, puis sous Propriétés regarder les propriétés de configuration -> Général -> Common Language Runtime Support

+0

Non, je n'ai pas activé le commutateur/clr. Il y a beaucoup de.c les fichiers et ils ne peuvent pas être compilés en utilisant le commutateur/clr – ramrocket

+0

Je suggère d'exécuter ceci dans le débogueur pour voir si la fenêtre de sortie et callstack vous en dit plus sur ce qui se passait quand l'erreur se produit. –

Questions connexes