VS2008 MFC
-
Hallo,
weiß jemand welche Dateien man mitgeben muss, wenn man eine MFC-App mit "MFC in einer gemeinsam genutzten DLL verwenden" auf einem anderen Rechner zum Laufen bringen will? Unter XP und unter Win2000?
edit: ohne das redistributable package mitgeben zu müssen...
-
So einfach geht das nicht. Du kannst die z.B. nicht ohne weiteres ins exe Verzeichnis kopieren; das wird nicht funktionieren.
Du hast wohl 2 Optionen- Assemblies im richtigen Windows Verzeichnis (redistributable package)
- private Assemblies
zu 2) siehe
http://blog.m-ri.de/index.php/2007/06/12/mein-erster-codeproject-artikel/
http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/
-
Naja, das einfachste ist immer noch: Statisch linken!
http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/Dann muss man gar nicht mitgeben.... ansonsten das hier installieren:
http://www.microsoft.com/downloads/details.aspx?familyid=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&displaylang=en
-
Danke für die Antworten.
Mit einer Exe geht das statisch linken gut, aber wenn ich zusätzlich eine Afx-Dll (Konfigurationstyp "Dynamische Bibliothek") erstellen will besteht er darauf dass als Codegenerierung "Multithreaded Dll" verwendet wird anstatt "Multithreaded" und dann bringt er das:Fehler 1 fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] C:\Programme\Microsoft Visual Studio 9.0\VC\atlmfc\include\afx.h 24
Das heisst dann wohl dass ich keine dlls mit statisch gelinktem MFC erstellen kann?
-
Du kannst nur Standard DLLs statisch linken, aber keine Extension DLLs!
Sobald die MFC und DLLs in Spiel kommt ist meistens ende mit statischem linken, weil kaum ein Entwickler sich Gedanken über die Datenübergabe zwischen DLL und EXE macht. Sobald MFC Objekte übergeben werden schließt sich statisches Linken einfach aus.
Also entweder Runtime installieren oder eine der angebotenen Lösungen benutzen.
-
Wenn ich die MFC dynamisch linke und die folgenden drei Dateien im Exe-Verzeichnis mitgebe scheint es zu funktionieren auch unter Win2000:
msvcr90.dll
msvcp90.dll
mfc90.dllSollte ich da noch was beachten oder kennt jemand Probleme die möglicherweise auftreten könnten?
-
ihoernchen schrieb:
So einfach geht das nicht. Du kannst die z.B. nicht ohne weiteres ins exe Verzeichnis kopieren; das wird nicht funktionieren.
Klar geht das. Wenn er alle Abhängigkeiten in sein Exe-Dir kopiert funktioniert das super ohne die Runtime zu installieren.
-
Unix-Tom schrieb:
ihoernchen schrieb:
So einfach geht das nicht. Du kannst die z.B. nicht ohne weiteres ins exe Verzeichnis kopieren; das wird nicht funktionieren.
Klar geht das. Wenn er alle Abhängigkeiten in sein Exe-Dir kopiert funktioniert das super ohne die Runtime zu installieren.
Es hat aber oft ungebetene Nebenwirkungen, wenn auf dem Rechner plötzlich *doch* die Runtime installiert wurde. Dann wird nämlich plötzlich eine andere Version geladen, als Du denskt...
Deshalb, wie Martin schon (in einem anderen Thread heute) gesagt hat: Entferne das "publicKeyToken" aus dem Manifest.
-
Die EXE sucht erst im Programmordner bevor es andere Ordner nach DLL absucht.
-
Nein. Das hat sich mit SxS geändert! Dein Wissen stammt noch aus W2k-Zeiten... und dann auch nur, wenn ein "name.der.exe.local" vorhanden war!
Probier es selber aus!
Starte eine EXE welche gegen die CRT linkt und schaue mit Prozess Explorer nach, welche msvc*.dlls geladen werden! Es werden die aus dem SxS Verzeichnis geladen, auch wenn Du lokal die korrekte Version liegen hast!Entfernst Du hingegen das "publicKeyToken" aus Deinem EXE-Manifest, wird die (aus Deiner Sicht) Korrekten DLLs gelesen
PS: Das ist auch der Grund, dass sowohl Martin als auch ich diverse Blog-Einträge diesem Thema widmen:
http://blog.kalmbach-software.de/2008/05/03/howto-deploy-vc2008-apps-without-installing-vcredist_x86exe/
http://blog.kalmbach-software.de/2008/05/05/main-disadvantage-of-really-applocal-deployment/
http://blog.kalmbach-software.de/2009/05/27/deployment-of-vc2008-apps-without-installing-anything/
-
Danke. Zumindest unter Windows XP mit VS 2005 war es noch so.
-
Unix-Tom schrieb:
Danke. Zumindest unter Windows XP mit VS 2005 war es noch so.
Nein! Auch hier gab es bereits Manifeste.
-
Das ganze gibt es seit VS2005 (und dann natürlich nur ab XP). Bis zu VS2003 war es noch so wie Du sagst... (oder bis W2k).