Applicationen in VS2005



  • Hallo,
    Ich habe eine Anwendung von VS6 nach VS2005 konvertiert und anschliessend mit dem VS2005 einen Installer für die Anwendung verfasst.
    Der Installer installiert das Prg einwandfrei.

    Problem:
    Wenn das Prg nach der erfolgreichen Installation aufgerufen wird, started es nicht, sondern es erscheint eine Meldung "Das Programm konnte nicht gestartet werden!".
    Der Dependcy Walker ausgeführt auf die installierte EXE gibt mir folgende Nachricht:
    "Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module."
    In der Module-Auflistung werden mir 4 einträge rot markiert. Allerdings sind im Funktionsübersichtsfenster alle Einträge grün dargestellt.

    Das VS2005 Anwendungs-Projekt generiert auch eine Manifest-Datei!

    Wenn ich das Prog. auf meinem Entwicklungs-PC installiere läuft das Prg. einwandfrei nur wenn es auf einem PC installiert wird, auf dem kein VS2005 installiert ist erscheint die o. g. Fehlermeldung!

    Könnt Ihr mir einen Tip geben!

    Gruss kpehrs



  • Wenn ich jetzt einfach mal so rate, dann würde ich sagen, dass die 4 roten DLLs auf dem anderen Rechner fehlen.



  • oder ne ältere Version haben.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ich habe das Prg. auch auf einem anderen PC installiert und versucht zu starten, bei dem der Dependency Walker alle abhängigen Dateien gefunden hat (sprich es gab keine Warnungen). Allerdings gabe es auch hier die Meldung "Das Programm konnte nicht gestartet werden" Auf dem PC war sogar noch das VS2005 und das .Net Framework 1.1 und 2.0 installiert!

    Gibt es irgendwie eine Möglichkeit herauszufinden, warum diese Meldung kommt? Auf meinem Entwicklungs-Pc läuft es wie erwähnt einwandfrei!

    Gruss Pehrs



  • Wie installierst Du das Programm? Schmeißt Du es einfach auf die Platte oder hast Du dafür ein separates Setup-Projekt? Ist in dem Installationspackage das C++ Redistributable Kit o.ä. mit dabei?



  • http://msdn2.microsoft.com/en-us/library/zebw5zk9.aspx
    Dort findet man mehrere Methoden, wie man seine Anwendung deployed. Die einfachste ist die sogenannte XCopy-Variante. Eine schöne Variante finde ich die mit dem Windows Installer, die jeder als *.msi kennt. Einfach im MSVS ein entsprechendes Projekt anlegen.

    Die für den Deployer einfachste (aber für den User umständlichste, weil Admin-Rechte nötig) ist die mit dem Redistpaket-Installer:
    http://www.kharchi.eu/wiki/doku.php?id=cpp:faq#warum_funktioniert_meine_exe_auf_einem_anderen_pc_nicht

    Was auch möglich ist, ist ein statisches Linken. Das kann man unter "C++" in den Projekteinstellungen unter Runtime/Laufzeit einstellen.





  • HansiHinterseher schrieb:

    http://msdn2.microsoft.com/en-us/library/zebw5zk9.aspx
    Dort findet man mehrere Methoden, wie man seine Anwendung deployed. Die einfachste ist die sogenannte XCopy-Variante. Eine schöne Variante finde ich die mit dem Windows Installer, die jeder als *.msi kennt. Einfach im MSVS ein entsprechendes Projekt anlegen.

    DRECK! da muss man die leute zwingen, mindestens version xy.gfsh des windows installers installiert zu haben.

    Eine sehr gute Lösung ist der freie Setup-Generator NSIS.



  • Vielen Dank Jochen für das Video,

    aber wenn ich die Anwendung nach den vorgeschlagenen Einstellungen übersetze bekomme ich diverse Fehlermeldungen der folgenden Art:

    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAE@ABV01@@Z)alreadydefinedinch_apparcs.objmsvcprt.lib(MSVCP80.dll):errorLNK2005:"public:__thiscallstd::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>:: basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>(void)"(??1?allocator@D@2@@std@@QAE@ABV01@@Z) already defined in ch\_app_arcs.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: \_\_thiscall std::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >::~basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >(void)" (??1?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QAE@XZ) already defined in ch_app_arcs.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAE@PBD@Z) already defined in ch\_app_arcs.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic\_string,class std::allocator > & \_\_thiscall std::basic\_string,class std::allocator >::operator=(class std::basic\_string,class std::allocator > const &)" (??4?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QAEAAV01@ABV01@@Z) already defined in es_de_file.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl std::operator+<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,char const *)" (???HDU??HDU?char_traits@D@std@@V?allocator@D@1@@std@@YA?AV?allocator@D@1@@std@@YA?AV?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@0@ABV10@PBD@Z) already defined in es_de_file.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl std::operator+<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (???HDU??HDU?char_traits@D@std@@V?allocator@D@1@@std@@YA?AV?allocator@D@1@@std@@YA?AV?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@0@ABV10@0@Z) already defined in es_de_file.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(char const *)" (??4?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAEAAV01@PBD@Z)alreadydefinedines_defile.objmsvcprt.lib(MSVCP80.dll):errorLNK2005:"public:__thiscallstd::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>(void)"(??0?allocator@D@2@@std@@QAEAAV01@PBD@Z) already defined in es\_de_file.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: \_\_thiscall std::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >(void)" (??0?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QAE@XZ) already defined in ch_app_exset.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator+=(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??Y?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAEAAV01@ABV01@@Z) already defined in es\_de_file.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void \_\_thiscall std::basic\_string,class std::allocator >::swap(class std::basic\_string,class std::allocator > &)" (?swap@?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QAEXAAV12@@Z) already defined in es_de_file.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "bool __cdecl std::operator==<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,char const *)" (???8DU??8DU?char_traits@D@std@@V?allocator@D@1@@std@@YA_NABV?allocator@D@1@@std@@YA\_NABV?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@0@PBD@Z) already defined in es_de_file.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator+=(char const *)" (??Y?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAEAAV01@PBD@Z) already defined in es\_de_file.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic\_string,class std::allocator > & \_\_thiscall std::basic\_string,class std::allocator >::assign(char const *,unsigned int)" (?assign@?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QAEAAV12@PBDI@Z) already defined in ch_app_arcs.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::erase(unsigned int,unsigned int)" (?erase@?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAEAAV12@II@Z)alreadydefinedinch_apparcs.objmsvcprt.lib(MSVCP80.dll):errorLNK2005:"public:char__thiscallstd::allocator<char>::allocate(unsignedint)"(?allocate@?allocator@D@2@@std@@QAEAAV12@II@Z) already defined in ch\_app_arcs.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: char * \_\_thiscall std::allocator<char>::allocate(unsigned int)" (?allocate@?allocator@D@std@@QAEPADI@Z) already defined in ch_app_arcs.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::allocator<char>::deallocate(char *,unsigned int)" (?deallocate@?allocator@D@std@@QAEXPADI@Z)alreadydefinedinch_apparcs.objmsvcprt.lib(MSVCP80.dll):errorLNK2005:"public:charconst__thiscallstd::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>::c_str(void)const"(?c_str@?allocator@D@std@@QAEXPADI@Z) already defined in ch\_app_arcs.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: char const * \_\_thiscall std::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >::c\_str(void)const " (?c\_str@?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QBEPBDXZ) already defined in ch_app_arcs.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::append(char const *)" (?append@?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAEAAV12@PBD@Z)alreadydefinedines_defile.objmsvcprt.lib(MSVCP80.dll):errorLNK2005:"public:unsignedint__thiscallstd::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>::length(void)const"(?length@?allocator@D@2@@std@@QAEAAV12@PBD@Z) already defined in es\_de_file.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: unsigned int \_\_thiscall std::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >::length(void)const " (?length@?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QBEIXZ) already defined in es_de_file.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: int __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::compare(unsigned int,unsigned int,char const *,unsigned int)const " (?compare@?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QBEHIIPBDI@Z) already defined in es\_de_file.obj msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic\_string,class std::allocator > & \_\_thiscall std::basic\_string,class std::allocator >::append(class std::basic\_string,class std::allocator > const &)" (?append@?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@QAEAAV12@ABV12@@Z) already defined in es_de_file.obj
    es_app_init.obj : error LNK2001: unresolved external symbol __winver

    Es wäre natürlich sehr schön, wenn ich das vcredist_x86.exe nicht mitlieferen muss!

    Gruss kpehrs



  • deine linkerfehler bedeuten, dass einige libs die du mitlinkst die statische runtime benutzen und einige die dynamische. Musst dich für eine entscheiden. Also wenn du jetzt eine dll oder lib mit multithreaded-dll linkst, muss auch deine anwendung mit multithreaded-dll gelinkt werden und alle weiteren libs die du benutzt.



  • Hallo,

    meine folgenden Projectsettings würde ich gerne beibeahlten und das vcredist_x86.exe im msi-installer mitliefern.
    Allerdings weiss ich nicht ob ich im msi nach der installation meiner Anwendung noch das Setup für die vcredist_x86.exe aufrufen kann. Falls dies möglich ist, kann mir jemand sagen wie ich das mache, da ich mich mit dem msi nicht auskenne!

    Im MSI-Project habe ich zwei merge-module eingebunden (vc80_crt_x86.asm und vc80_debugcrt_x86.asm). Wenn ich dann den Installer baue und anschliessend auf einem PC installiere welcher kein VS2005 installiert hat. Bekomme ich die Meldung "Das Programm kann nicht gestartet werden!" Nur wenn ich die vcredist_x86.exe vorher installiere funktioniert es!

    Vielen Dank!

    Gruss kpehrs



  • mach es lieber professionell! mit nsis hast du wesentlich bessere möglichkeiten und musst keinen installer 3.1, der standardmäßig nicht installiert ist, erzwingen. für nsis gibt es viele tools (unter anderem ein eclipse plugin), die bei guis und nsi skripten helfen. es sind auch viele funktionen schon fertig und es gibt viele beispiele.

    hier steht, wie man checkt, ob die vc8 runtime installiert ist.
    hier steht, wie man andere installer, wie z. bsp. das vc8-redist-setup, integriert.


Log in to reply