2010-06-03 4 views
0

J'ai une application Win32 C++ utilisant une poignée de DLL tierces installées sur une centaine de machines client. J'ai récemment testé la version x86 de l'installation avec succès sur Windows XP, Windows Vista x64, Windows 7 x86 ainsi que Windows Server 2008 x86. Pas de problème. Le programme d'installation (nullsoft) installe les fichiers redistribuables pour VC 2005 et VC 2008 car les deux fichiers DLL requis sont requis.Pourquoi mon application ne fonctionne-t-elle pas avec la version x64 de Windows Server 2008?

Mais avec Windows Server 2008 x64, les versions x86 et x64 refusent de démarrer. Quand je commence la version x86 du programme, une boîte de dialogue apparaît:

<myApp> has stopped Working. 

Le EventLog contient un message:

Faulting application myapp.exe, version 1.0.0.0, time stamp 0x4bcb37ca, 
faulting module MSVCR80.dll, version 8.0.50727.4053, time stamp 0x4a594c79, 
exception code 0xc000000d, fault offset 0x0001ce0b, process id 0x29c, 
application start time 0x01cb0329976cfc68. 

\ Windows \ winsxs contient un répertoire

x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_d08d7da0442a985d 

En utilisant sxstrace (premier suivi, puis analyse) un fichier journal de 3 Bytes est créé contenant des caractères non lisibles. Le comportement de la version x64 est similaire. De plus, tous les programmes de démonstration des DLL tierces fonctionnent correctement. Un indice?

Répondre

1

Cela ne ressemble pas à une erreur côte à côte. Le code d'exception est STATUS_INVALID_PARAMETER, "Un paramètre non valide a été transmis à un service ou à une fonction". Cela n'aide pas. Vous aurez besoin d'un débogueur, probablement avec les symboles de débogage de Windows. Faites-le arrêter sur l'exception de la première chance.

+0

Vous aviez raison: j'ai copié WinDbg.exe sur la machine avec les sources et un fichier pdb. J'ai alors pu voir, que la variable d'environnement NUMBER_OF_PROCESSORS n'est pas définie sur cette machine. Mon application n'a pas vérifié la valeur de retour de getenv() et a écrasé le déréférencement de ce pointeur NULL. Tout ce qui s'est passé lors de l'initialisation des objets globaux et donc avant WinMain a même été saisi et avant qu'un fichier journal ait été créé. Merci pour le conseil, en utilisant un débogueur! Je n'aurais pas trouvé ça dans ce cas. –

Questions connexes