VC++ Multithreaded-DLL & Multithreaded



  • ich wollte mal die bessere Lösung ist:

    1. Das Programm mit Multithreaded-DLL bauen und die DLL's dann mit dem Installer mitliefern?

    2. Das Programm mit Multithreaded-DLL bauen und dem User das Redistributable Package installieren lassen?

    3. Multithreaded und dann überhaupt nichts mitliefern

    Ich wollte für mein Programm den 3ten Weg gehen... hab da aber das Problem das er beim std::string::append dann abstürzt...

    Hier ist mal der Stacktrace:
    f:\dd\vctools\crt_bld\self_x86\crt\src\free.c (110): free
    c:\program files (x86)\microsoft visual studio 9.0\vc\include\xstring (2106): std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy
    c:\program files (x86)\microsoft visual studio 9.0\vc\include\xstring (983): std::basic_string<char,std::char_traits<char>,std::allocator<char> >::append
    d:\c++\frameworks\k3engine\k3engine\game.cpp (106): k3Engine::Core::CGame::CGame
    d:\c++\programme\sally\sally\sallyapp.cpp (5): CSallyApp::CSallyApp
    d:\c++\programme\sally\sally\main.cpp (110): WinMain
    f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c (263): __tmainCRTStartup

    Das ganze läuft aber ohne Probleme wenn ich es mit Multithreaded-DLL bauen lass...
    Ich kann mir das echt nicht erklären. Hat jemand eine Lösung?
    Oder soll ich doch den Weg 1 oder 2 gehen?



  • ach ja, ich hab Visual Studio 2008

    Hab auch schon das ein neues Project erstellt... hat aber auch nicht geholfen.



    Und der Absturz ist unabhängig von der verwendeten CRT-Version (es sei denn, Du verwendest noch *andere* DLLs, welche die DLL-Version der CRT voraussetzen!)

    Wenn Du zu der Game-DLL die Sourcen hast, dann binde diese doch auch direkt in Dein Projekt ein oder stelle das DLL-Projekt nach LIB um, und dann kannst Du auch die 3. Variante verwenden...



  • ja, die Game-Sourcen hab ich auch... allerdings wollte ich das getrennt lassen.

    Zur Info: Das ganze Project besteht aus 3 dlls (alle von mir) und 4 Exe files.
    Bei den anderen Exe Files passiert das gleiche...

    Was meinst du mit "oder stelle das DLL-Projekt nach LIB"?



  • Der_Knob schrieb:

    ja, die Game-Sourcen hab ich auch... allerdings wollte ich das getrennt lassen.

    Dann mach eine LIB draus...

    Der_Knob schrieb:

    Zur Info: Das ganze Project besteht aus 3 dlls (alle von mir) und 4 Exe files.
    Bei den anderen Exe Files passiert das gleiche...

    Was meinst du mit "oder stelle das DLL-Projekt nach LIB"?

    Stelle in den Projekteinstellungen von "DLL" auf "LIB" um 😉
    "General: Configuration Type" von "Dynamic Library (.dll)" nach "Static library (.lib)"

    Ich vermutle aber mal, dass dies nicht das einzige ist, was Du tun musst.... dur brauchst auch das ganze "__dllimport/export" Zeugs nicht mehr... mach einfach ein leeres Define...



  • mh ok... das zerschießt mir jetzt aber meine ganze Plugin Architektur 😞

    Und so leicht kann ich das im moment nicht umstellen...

    Ich denk dann werd ich doch den 1ten oder 2ten Weg gehen müssen...
    Aber Danke für deine Hilfe!



  • Ok, hab jetzt noch eine Frage... ich versuch jetzt Weg 1 zu gehen und die DLL's mitzuliefern... klappt aber leider nicht 😞

    Hat jemand eine gute Anleitung dafür?
    Hab zwar einige Seiten gefunden... allerdings bin ich etwas verwirrt von den ganzen sachen...
    Kenn mich damit auch nicht wo wirklich aus muss ich zugeben.

    Mein Programm nutzt eigentlich nur die Microsoft.VC90.CRT dll's ... aber einfach reinkopieren geht ja nicht.

    Was ich brauche ist doch "Deploying Visual C++ library DLLs as private assemblies"
    Dafür hab ich auch hier was gefunden: http://msdn.microsoft.com/de-de/ms235291(en-us,VS.80).aspx

    Aber das klappt bei mir nicht... die kopieren doch nur die files oder?

    Was ich auch komisch finde ist, das in der Manifest Datei unter C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\ die Version 9.0.30729.1 steht.
    Meine Manifest Datei sieht aber so aus:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
          </requestedPrivileges>
        </security>
      </trustInfo>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    

    also eine ältere Version: 9.0.21022.8



  • 1. Du musst auch die *.manifest-Dateien der CRT-DLLs mitliefern!
    2. Ich empfehle das "publicKey"-Token zu entfernen...

    Siehe mein Blog:
    http://blog.kalmbach-software.de/2008/05/03/howto-deploy-vc2008-apps-without-installing-vcredist_x86exe/





  • Ich hab mich jetzt für Version von Martin entschieden, da bei dieser nichts an den Project Einstellungen gedreht werden muss...

    Bei meinem Test Project ging alles gut... Jetzt bin ich gerade dabei die einzelnen Teile der Anwendung umzubauen und es sieht gut aus!

    Danke euch für die Hilfe!


Anmelden zum Antworten