Hallo
Ich suche nach einer Möglichkeit, aus einem Programm heraus zu testen, ob die CRuntime Dlls, die MFC Dlls und MSXML4 DLLs auf einem Zielsystem installiert sind oder nicht. Der Hintergrund dazu ist folgender:
Ich habe eine Visual C++ 8.0 Anwendung bei der ich dynamisch gegen die Laufzeitbibliotheken (CRT) und die MFC linke. Statisches Linken ist nicht möglich, da die Anwendung MFC Extensions verwendet, siehe dazu
http://msdn.microsoft.com/en-us/library/h5f7ck28(VS.80).aspx
Ausserdem verwendet diese Anwendung MSXML4. Die betreffenden Bibliothekten die auf dem Zielsystem benötigt werden sind also die Folgenden:
Laufzeitbibliotheken (CRT): msvcm80.dll, msvcp80.dll, msvcr80.dll
Mfc Dlls: mfc80.dll, mfc80u.dll, mfcm80.dll, mfcm80u.dll
MSXML4 Dlls: msxml4.dll, msxml4r.dll
Mir ist das Problem bekannt, dass es nicht ausreicht diese DLLs auf das Zielsystem in den System32 Ordner oder den Ordner der Anwendung zu kopieren, da Visual Studio 2008 die Shared Side By Side Verwendung für CRT und MFC Dlls vorsieht (installation in WinSxS Ordner), und da MSXML4 ebenfalls in Windows registriert werden sollte. Mir ist auch bekannt dass es Tricks gibt diese Anforderungen durch Manipulationen am Manifest der Anwendung zu umgehen. Siehe hierzu:
http://mcblogs.craalse.de/sku?title=visual_studio_2005_runtimes_part_2_sich&more=1&c=1&tb=1&pb=1
http://codehq.net/cs/blogs/john/arc...installed-by-a-non-administrator-account.aspx
Allerdings sehe ich bei den Lösungen die auf die Manipulation der Manifeste hinauslaufen bestimmte Einschränkungen und mögliche zukünftige Probleme.
Ich würde lieber dafür sorgen dass auf dem Zielsystem vor der Ausführung der C++ Anwendung ein anderes Programm gestartet wird, das zunächst testet ob MSXML4 und die benötigten Bibliotheken für MFC und und CRT installiert sind, um im Fall einer fehlenden Bibliothek den Benutzer aufzufordern diese zu installieren. (Insbesondere will ich die Standardfehlermeldung vermeiden.)
Ich habe zwar ein paar Hinweise gefunden, aber noch keinen Ansatz der mich so richtig überzeugt.
z.B. Der Versuch, eine DLL zu Laden welche die CRT verwendet wie bei ...
http://www.codeproject.com/KB/cpp/vcredists_x86.aspx#PrivateAssembly
um beim fehlgeschlagenen Laden festzustellen dass CRT nicht verfügbar ist, ist keine schöne Lösung. Außerdem kenne ich noch folgende Links die mit dem Thema zu tun haben:
http://forums.winamp.com/printthread.php?threadid=292487&perpage=19
http://nsis.sourceforge.net/WinSxS_QueryAssemblyInfo_to_check_if_assembly_is_installed
http://blogs.msdn.com/astebner/arch...e-vc-8-0-runtime-redistributable-package.aspx
http://blogs.msdn.com/astebner/arch...-of-the-vc-8-0-runtime-vcredist-packages.aspx
http://social.technet.microsoft.com...l/thread/edebee83-4595-4d7e-8738-a865a7111d20
Was soweit hängengeblieben ist: anhand der Registry zu ermitteln scheint nicht der richtige Weg zu sein, und auch jede sonstige vorgeschlagene Lösung scheint einen Haken zu haben.
Weiß jemand eine einfache, unproblematische Lösung zu diesem Problem ?
Für Lösungsvorschläge bedanke ich mich im Voraus.
Viele Grüße
Frogger
Ich suche nach einer Möglichkeit, aus einem Programm heraus zu testen, ob die CRuntime Dlls, die MFC Dlls und MSXML4 DLLs auf einem Zielsystem installiert sind oder nicht. Der Hintergrund dazu ist folgender:
Ich habe eine Visual C++ 8.0 Anwendung bei der ich dynamisch gegen die Laufzeitbibliotheken (CRT) und die MFC linke. Statisches Linken ist nicht möglich, da die Anwendung MFC Extensions verwendet, siehe dazu
http://msdn.microsoft.com/en-us/library/h5f7ck28(VS.80).aspx
Ausserdem verwendet diese Anwendung MSXML4. Die betreffenden Bibliothekten die auf dem Zielsystem benötigt werden sind also die Folgenden:
Laufzeitbibliotheken (CRT): msvcm80.dll, msvcp80.dll, msvcr80.dll
Mfc Dlls: mfc80.dll, mfc80u.dll, mfcm80.dll, mfcm80u.dll
MSXML4 Dlls: msxml4.dll, msxml4r.dll
Mir ist das Problem bekannt, dass es nicht ausreicht diese DLLs auf das Zielsystem in den System32 Ordner oder den Ordner der Anwendung zu kopieren, da Visual Studio 2008 die Shared Side By Side Verwendung für CRT und MFC Dlls vorsieht (installation in WinSxS Ordner), und da MSXML4 ebenfalls in Windows registriert werden sollte. Mir ist auch bekannt dass es Tricks gibt diese Anforderungen durch Manipulationen am Manifest der Anwendung zu umgehen. Siehe hierzu:
http://mcblogs.craalse.de/sku?title=visual_studio_2005_runtimes_part_2_sich&more=1&c=1&tb=1&pb=1
http://codehq.net/cs/blogs/john/arc...installed-by-a-non-administrator-account.aspx
Allerdings sehe ich bei den Lösungen die auf die Manipulation der Manifeste hinauslaufen bestimmte Einschränkungen und mögliche zukünftige Probleme.
Ich würde lieber dafür sorgen dass auf dem Zielsystem vor der Ausführung der C++ Anwendung ein anderes Programm gestartet wird, das zunächst testet ob MSXML4 und die benötigten Bibliotheken für MFC und und CRT installiert sind, um im Fall einer fehlenden Bibliothek den Benutzer aufzufordern diese zu installieren. (Insbesondere will ich die Standardfehlermeldung vermeiden.)
Ich habe zwar ein paar Hinweise gefunden, aber noch keinen Ansatz der mich so richtig überzeugt.
z.B. Der Versuch, eine DLL zu Laden welche die CRT verwendet wie bei ...
http://www.codeproject.com/KB/cpp/vcredists_x86.aspx#PrivateAssembly
um beim fehlgeschlagenen Laden festzustellen dass CRT nicht verfügbar ist, ist keine schöne Lösung. Außerdem kenne ich noch folgende Links die mit dem Thema zu tun haben:
http://forums.winamp.com/printthread.php?threadid=292487&perpage=19
http://nsis.sourceforge.net/WinSxS_QueryAssemblyInfo_to_check_if_assembly_is_installed
http://blogs.msdn.com/astebner/arch...e-vc-8-0-runtime-redistributable-package.aspx
http://blogs.msdn.com/astebner/arch...-of-the-vc-8-0-runtime-vcredist-packages.aspx
http://social.technet.microsoft.com...l/thread/edebee83-4595-4d7e-8738-a865a7111d20
Was soweit hängengeblieben ist: anhand der Registry zu ermitteln scheint nicht der richtige Weg zu sein, und auch jede sonstige vorgeschlagene Lösung scheint einen Haken zu haben.
Weiß jemand eine einfache, unproblematische Lösung zu diesem Problem ?
Für Lösungsvorschläge bedanke ich mich im Voraus.
Viele Grüße
Frogger