Crash (R6034) beim Starten von Applikation



  • Hm ich denke mal, dass die DLL'S/LIB's der SvnCppApi (Library) mit ner anderen C-Run-Time kompiliert wurden, als dein (Haupt-)Projekt. Die sind dann nicht kompatibel, deswegen der Crash.



  • Hm, das könnte es tatsächlich sein: Meine Applikation verwendet selbst MSVCR80.DLL, die abhängigen DLLs die MSVCRT.DLL.
    Kann ich meinem VS2005 beibringen die alte Runtime zu verwenden?



  • dEUs schrieb:

    Das fehlende Manifest kann aber nicht in meiner Applikation sein, da diese ja korrekt hochkommt, solange ich nichts aus der API verwende.

    Warum glaubst Du das?
    Die DLL prüft beim Laden der DLL in den Prozess ob ein Manifest vorhanden ist. Wenn nicht kommt die oben gezeigte Fehlermeldung. Ob Du nun was daraus verwendest oder nicht spielt dabei keine Rolle... (aber Du verwendest ja irgendwas daraus, sonst würde die DLL ja gar nicht geladen 😉 ).

    Also: Manifest verwenden (kann auch eine externe sein):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    


  • dEUs schrieb:

    Kann ich meinem VS2005 beibringen die alte Runtime zu verwenden?

    Nein. Du kannst aber statisch linken.



  • Nein, das geht leider nicht, da die fraglichen DLLs von der API oder noch einer Stufe weiter unten verwendet werden und ich außerdem den Quellcode davon nciht habe... 😞



  • Dann nimm doch einfach das Manifest.
    Name: Meine.exe.manifest



  • Wovon? Bzw was soll ich damit tun?



  • Wenn Du die VC8 CRT/ATL/MFC DLLs verwendet will (musst), dann brauchst Du ein Manifest auf allen Rechnern >= XP. (Punkt)

    Du hast nun zwei Möglichkeiten:
    1. Du lieferst mit Deiner EXE eine separate Datei mit, welche "name-der.exe.manifest" heist
    2. Du bettest diese Manifestdatei in die Resourcen Deiner EXE ein

    Zum Inhalt:
    Eigentlich erzeugt das VS2005 automatisch eine Manifest-Datei und bindest diese auch autoamtisch ein. Du kannst auch nochmals in Deinen Projekteinstellungen nachschauen: "Configuration Properties|Manifest Tool|Input and Output|Embed Manifest:Yes"
    In Deinem Debug/Release-Verzeichnis müsste auch irgendwas mit dem Namen "manifest" auftauchen.

    Oder eben Du nimmst den Inhalt, den ich weiter oben gepostet habe.



  • Jochen, wie gesagt, die Manifest-Datei wird erzeugt und ins Programm eingebettet. Das ist nicht der Fehler.



  • Ach so... hab ich irgendwie überlesen...
    Vermutlich braucht aber noch die DLL ein Manifest mit der ID2... (irgendwas war da mal).
    Sonst Schick mir einfach mal das Projekt zu...



  • Jochen Kalmbach schrieb:

    Vermutlich braucht aber noch die DLL ein Manifest mit der ID2... (irgendwas war da mal).

    Kannst du da genauer werden?



  • dEUs schrieb:

    Jochen Kalmbach schrieb:

    Vermutlich braucht aber noch die DLL ein Manifest mit der ID2... (irgendwas war da mal).

    Kannst du da genauer werden?

    Ich suche noch... hab da nur was im Hinterkopf gehabt...

    ADD: Vermutlich lag ich aber falsch. Es muss gehen, wenn Du in der EXE das korrekte Manifest drin hast. Was steht denn in dem Manifest für die EXE drin?
    Versuche es doch mal mit einem externen Manifest!



  • Das Manifest sieht so aus:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    

    Bitte schick mir eine eMail über das Forum, so dass ich deine eMail-Adresse habe, dann würde ich es dir mal zuschicken.



  • Das Problem ist, dass Du eine Debug-Version Deiner EXE erzeugst aber eine DLL die Release-Version der CRT will!
    Also entweder Du änderst Dein Debug-Manifest nach

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    

    Oder (besser) Du linkst gegen die korrekte LIB, welche auch die Debug-CRT verwendet. Meine Vermutung ist, dass wenn Du gegen die Release-LIBs Deiner DLLs linkst und Du gemeinsamen Speicher über die DLL Grenzen hinweg verwendest, dann wird es sowieso zu abstürzen kommen, da Du ja unterschiedliche CRT-Versionen verwendest.
    Also: Linke gegen die korreten Debug-LIBs, welche die *gleiche* CRT verwenden!



  • Hi Jochen,

    dank dir, das war das Problem! Wenn ich das ganze als Release kompilere, dann tritt der Fehler nicht mehr auf.

    Werde mich dann mal auf die Suche der Debug-DLLs machen.


Anmelden zum Antworten