Compilieren in 64bit: mcrtexe.cpp findet main() nicht mehr



  • Hallo Experten,
    ich habe in VS 2008 eine größere Solution mit vielen Projekten. Oberfläche als C++.NET und der Rest in nativen C++. Sie lief prima als 32bit Version. Jetzt versuche ich das Projekt umzustellen von 32bit auf 64bit auf meinem 64bit Win 7 PC. Hier scheitert er schon direkt nach dem Start in mcrtexe.cpp/_mainCRTStartup(array<String> arguments):

    [...]
    #if defined (_MANAGED_MAIN)
                mainret = main(arguments);
    [...]
    

    Es kommt ein kleines Dialogfenster und sagt mir

    FileNotFoundException was unhandled.
    The specified module could not be found. (Exception from HRESULT: 08007007E)

    Und zwar egal ob es als Release oder als Debug configuriert ist.

    Bei der 32bit Version springt er an dieser Stelle ganz brav in meinen Code (main() in MyProject.cpp).

    Ich bin ratlos.

    Zusatzinfo: Ich binde ein paar DLLs ein die ich nicht geschrieben habe. Könnten die Probleme machen? ZB dass sie 32bittig sind und dadurch der Code irgendwie nicht geladen werden kann?

    So läuft der Ladevorgang ab:

    'MyProject.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'
    'MyProject.exe' (Managed): Loaded 'd:\Project\MyProject\x64\Debug\MyProject.exe', Symbols loaded.
    'MyProject.exe' (Managed): Loaded 'C:\Windows\WinSxS\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_e2a22cc340da0d62\msvcm90d.dll', Symbols loaded.
    'MyProject.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll'
    'MyProject.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll'
    'MyProject.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll'
    A first chance exception of type 'System.IO.FileNotFoundException' occurred in MyProject.exe
    

    Danke im Voraus für jegliche Hinweise!
    mdew



  • 1. Doppelposts sind blöd, lass das hin und herschieben der Moderatoren Arbeit sein.
    2. Die DLLs machen wahrscheinlich die Probleme. 32-Bit DLL in 64-Bit-Prozess verträgt sich nicht gut. Probier mal die DLLs auch als 64-Bit-Variante zu kompilieren:
    http://stackoverflow.com/questions/225151/can-i-load-a-32-bit-dll-into-a-64-bit-process-on-windows



  • 1. Sorry, bin neu in diesem Forum Passiert nicht wieder...
    2. Ehrlich gesagt hätte ich dann eine Fehlermeldung wie
    System.BadImageFormatException
    zur Laufzeit erwartet. Hier wird aber main() gar nicht erst gefunden. MyProject ist .NET und als 64bit Version compiliert.

    In welchem Verzeichnis sucht denn mcrtexe.cpp/_mainCRTStartup() nach dem File (MyProject.exe) welches main() enthält? Kann ich irgendwo einsehen welches Verz. hier verwendet wird? Vielleicht verirrt er sich gerade an dieser Stelle...?

    Spekulative Güße
    mdew



  • Mach mal die DLL/EXE mit DependencyWalker auf, der zeigt i.d.R. gleich an was fehlt. Es fehlt eine DLL welche explizit angegeben ist und somit geladen sein muss, *bevor* die main angesprungen wird. Diese DLL findet er nicht, weil er vermutlich im _richtigen_ Verzeichnis sucht und Du sie in das falsche kopiert hast oder es aber eine 32-Bit DLL ist, welche er nicht laden. Die BadImage-Exception kommt nur bei .NET Assemblies... wenn aber eine native DLL nicht gefunden wird kommt diese nicht...



  • Jochen Kalmbach schrieb:

    Mach mal die DLL/EXE mit DependencyWalker auf, der zeigt i.d.R. gleich an was fehlt. Es fehlt eine DLL welche explizit angegeben ist und somit geladen sein muss, *bevor* die main angesprungen wird. Diese DLL findet er nicht, weil er vermutlich im _richtigen_ Verzeichnis sucht und Du sie in das falsche kopiert hast oder es aber eine 32-Bit DLL ist, welche er nicht laden.

    Guter Hinweis! Scheint es aber leider doch nicht zu sein. Der DependencyWalker zeigt sogar in der 32bit Version mehr Probleme an obwohl die 32bit-Version problemlos funktioniert. Merkwürdigkeiten wurden nur bei ACE.DLL detektiert:

    32bit Mode
    ACE.dll benötigt aber findet nicht Delayed-Load GPSVC.DLL und Delayed-Load IESHIMS.DLL

    Delayed-Load IEFRAME.DLL und Delayed-Load SHLWAPI.DLL: "Module warning. This module is either missing one or more export functions that are required by its parent module, is of the wrong CPU type, or failed to initialize when being loaded"

    Fehlermeldungen:
    "Warning: At least one delay-load dependency module was not found."
    "Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module."

    64bit Mode
    Hier wird GPSVC.DLL gefunden. Ansonsten exakt wie bei der 64bit Version.

    Fazit
    Delayed-load DLLs scheinen nicht notwendig zu sein um eine Appl. zumindest zu starten. Macht ja auch Sinn. Von daher sollte main() gefunden werden.

    Habe ich etwas übersehen oder hat noch jemand eine Idee?

    Grüsse mdew



  • Starte doch mal die App via DependencyWalker...



  • Jochen Kalmbach schrieb:

    Starte doch mal die App via DependencyWalker...

    Hey, das war es!

    Er hatte zwar keine falschen DLLs versucht zu laden. Dafür aber wichtige DLLs die er in einer eingebundenen DLL brauchte gar nicht erst zur Verfügung gehabt. Die eingebundene DLL konnte ich über ein Profiling ausfindig machen. Die fehlenden DLLs fand ich dann über den DependencyWalker für die eingebundenen DLL. Da hab ich wieder dazugelernt.

    Vielen Dank Jochen! Du hast mein Wochenende gerettet! Das ist in keiner Weise zu unterschätzen...

    Alles Gute und weiter so!
    mdew


Anmelden zum Antworten