In einem Programm testen ob MFC80, CRT und MSXML4 installiert sind ?

Frogger

Grünschnabel
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
 

Endurion

Erfahrenes Mitglied
Würde ein simples LoadLibrary nicht genügen? Das geht dann natürlich nicht auf die Versionsnummern ein, aber rein zum Feststellen, ob die DLL da ist.
 

Frogger

Grünschnabel
Das wäre die Lösungsvariante, die in dem oben verlinkten Artikel bei Codeproject vorgeschlagen wird, und dort auch im Programmbeispiel enthalten ist. Das Problem dabei ist schonmal dass ich mit Dummy DLLs arbeiten müsste (Eine DLL um zu testen ob CRT fehlt, eine um zu testen ob auch MFC fehlt, und noch eine für MSXML ... falls im Fall von MSXML überhaupt genauso vorgegangen werden kann ...) Diesen Ansatz wollte ich lieber vermeiden.

Edit: oder meinst Du ein LoadLibrary direkt auf die CRT und MFC DLLs von Microsoft ? Kann man das so machen ? Vielleicht eine Möglichkeit ... müsste noch überlegen was dafür oder dagegen spricht so vorzugehen ...
 
Zuletzt bearbeitet:

Endurion

Erfahrenes Mitglied
Ich meine das letztere. Das prüft halt auch nur, ob die DLL irgendwo im Pfad liegt. Ob sich das mit Side-by-Side richtig verhält ist wieder eine andere Geschichte.