MFC-DLLs statisch in Anwendung einbinden ?

kscha

Mitglied
Hallo alle zusammen !

Ich habe bis jetzt noch nie (bewusst bzw. aktiv) mit DLLs gearbeitet. Deshalb habe ich nun folgendes Problem (ich versuche es so einfach wie möglich zu formulieren):

Ich habe in Visual C++ 6.0 (MFC) eine GUI entwickelt. Wenn ich diese .exe-Datei auf meinem Rechner starte, dann läuft alles einwandfrei. Starte ich jedoch diese Anwendung auf einem Rechner auf dem kein Visual C++ 6.0 installiert ist, dann bringt er mir die Fehlermeldung '... .dll nicht gefunden' (z.B. MFC42D.dll oder MSVCRTD.dll). Ich würde jetzt gerne die Anwendung unabhängig von irgendwelchen Programmen oder DLLs laufen lassen können.

Und hier jetzt meine Fragen dazu:
1. Wie kann ich DLLs statisch in meine .exe einbinden, so dass ich nur die exe-Datei auf einen Rechner kopieren muß und somit unabhängig von DLLs bin ?
2. Wie ist dafür die genaue Vorgehensweise ?
3. Wie kann ich herausfinden, welche DLLs von der Anwendung überhaupt genutzt bzw. benötigt werden ?

Für mögliche Lösungsvorschläge wäre ich SEHR dankbar !!

Viele Grüße
Kai
 
Hi Kai,

soweit ich weiss, kann man die benötigten DLLs der MFC gar nicht direkt in die Anwendung einlinken - jedenfalls nicht mit Visual C++ und ein anderes Tool dafür kenn ich nicht.
Wobei das meiner Meinung nach eigentlich sowieso keinen Sinn macht, weil es die eigentliche Anwendung nur unnötig aufpumpt.

Erstell Dir lieber ein Setup, in dem Du die benötigten DLLs mit einbindest und auf dem Zielrechner installierst. Das hat auch den Vorteil, dass Du die Bibliotheken nur einmal installieren musst und bei späteren Updates nur die kleine Anwendung ausliefern musst.
 
Hallo Lirion !!

Vielen Dank ! Das klingt super !
Aber wie muß das Setup-Programm denn aussehen bzw. wie muß es aufgebaut sein und was muß da alles drinstehen ? Ich muß gestehen: ich habe sowas noch nie gemacht :-(

Die DLLs müssen ja dann auch in einem extra Ordner mit rüberkopiert werden ?! Weißt Du, wie ich rausfinden kann, welche ich überhaupt brauche ?

Nochmal vielen Dank !

Viele Grüße

Kai
 
Für die Erstellung von einem solchen Setup gibt es üblicherweise spezielle Programme, die das ganze automatisieren. Ich bin mir nicht sicher, aber ich behaupte mal, dass bei Visual C++ auch der Paket- und Weitergabe-Assistent integriert ist.

Solche Tools zur Setuperstellungen haben auch meist einen eingebauten Dependency-Scanner, der die benötigten DLLs aus dem Projekt ausliest und in das Setup einbindet. :)
 
moin


projekt -> einstellungen -> allgemein -> da gibbet das

vergiss nicht die einstellungen fürn debug UND release zu machen!


mfg
umbrasaxum
 
Zuletzt bearbeitet:
Hallo umbrasaxum und Lirion !!

Super, es hat geklappt ! Ich habe jetzt die MFC in einer statischen Bibliothek. Natürlich ist dadurch meine exe von 188kB auf 2,3MB angewachsen (wie Lirion ja gesagt hat), aber das ist im Moment nicht mein Problem... mein Chef wollte es ja unbedingt so :)

Übrigens, Lirion, einen Setup-Assistenten habe ich in Visual C++ nicht finden können.... Schade, aber so geht's ja auch ! Obwohl ich für die Zukunft gerne auf diese Möglichkeit des Setups zurückgreifen würde !!!

Nochmal vielen Dank für Eure tolle Hilfe !!

Viele Grüße

Kai
 
Ich steh weiterhin dazu, dass die DLLs dynamisch geladen werden sollten. Nehmen wir nur mal an, dass 10 verschiedene Anwendungen auf die gleichen DLLs zugreifen, und bei jeder Anwendung sind alle DLLs direkt in die Anwendung verlinkt.
Und da die MFC-Bibliotheken zentrale Bestandteile für die Anwendungen sind, die mit Visual C++ compiliert werden, kann man davon ausgehen, dass jede VC++-Anwendung diese Komponenten benötigt. Da wäre es doch deutlich sinnvoller, wenn diese Komponenten nur einmal installiert werden und dann für alle Anwendungen zur Verfügung stehen.

Für die Erstellung von Setups gibt es auch kostenlose (evtl. sogar Open Source) Tools im Internet - die sind auch mehr oder weniger komfortabel. Falls die Software später kommerziell vertrieben werden soll, ist aber IMHO eins von den professionellen Tools dazu sinnvoller. :)
Einfach mal bei Google suchen.
 
moin

@Lirion
du hast natürlich recht! aber wenn es nur eine kleine anwendung ist dann kann man es sich ruhig erlauben die dlls statisch einzubinden.
wenn ich z.b. ein programm schreib das mir eine liste von meinen mp3s erstellt will ich nciht unbedingt großartig etwas installieren.

und speicherplatz ist heute zu tage auch da.

es muss jeder für sich wissen.


mfg
umbrasaxum
 
Das kommt darauf an, was Du mit "kleine Anwendungen" meinst. Wenn Du damit kleine Tools meinst, die Du mehr für Dich selbst gemacht hast, ist es klar, dass Du kein Setup brauchst - Du hast ja schon alle Komponenten. ;)
Aber wenn es darum geht, irgendetwas weiterzugeben, sollte man schon darauf achten, dass es kleine Anwendungen bleiben. Speicherplatz ist noch gar nicht mal unbedingt das Ausschlaggebende. Es gibt auch in der heutigen DSL-Zeit immer noch genug Leute wie mich, die mit analogen Modems unterwegs sind.
Da finde ich es eigentlich nicht so angenehm, wenn ich mir 10 Mal 3 Megabyte runterladen muss. Die bessere Alternative wäre es, einmal die Komponenten mit 3 Megabyte runterzuladen und dann alle 10 Anwendungen mit jeweils ca. 100 Kilobyte.
Die 26 Megabyte Unterschied machen sich nämlich mit einem 33k-Modem doch schon ziemlich bemerkbar. ;)
 
mir die Fehlermeldung '... .dll nicht gefunden' (z.B. MFC42D.dll oder MSVCRTD.dll). Ich würde jetzt gerne die Anwendung unabhängig von irgendwelchen Programmen oder DLLs laufen lassen können.
Das Programm als Release übersetzten, sollte dem ganzen Problem ein Ende bereiten, denn auf 99,9% aller Windows Rechner sind die MFC-DLL's vorhanden aber hald nicht als Debug-Version.

Beispiel:
Bei einem "frisch" installierten Windows 2000 (ohne jegliche Programme) sind die beiden DLL's bereits vorhanden:
MFC42.dll und
MSVCRT.dll
!!!! aber hald ohne das "D", denn das sind die Debug-Versionen die Visual Studio mitbringt, die bitte nicht ausliefern !!!

Gruss Homer
 
Zurück