# MFC-DLLs statisch in Anwendung einbinden ?



## kscha (23. Juni 2003)

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


----------



## Dario Linsky (23. Juni 2003)

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.


----------



## kscha (23. Juni 2003)

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


----------



## Dario Linsky (23. Juni 2003)

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.


----------



## Tobias K. (23. Juni 2003)

moin


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

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


mfg
umbrasaxum


----------



## kscha (23. Juni 2003)

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


----------



## Dario Linsky (23. Juni 2003)

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.


----------



## Tobias K. (23. Juni 2003)

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


----------



## Dario Linsky (23. Juni 2003)

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.


----------



## Daniel Toplak (23. Juni 2003)

> 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


----------



## Tobias K. (23. Juni 2003)

moin


@Lirion
da bin ich ganz deiner meinung!


mfg
umbrasaxum


----------



## Gauloi (24. Juni 2003)

@lirion: es bleibt doch trotzdem albern, für'n programm, welches die größe von 2 MB und eine zielgruppe eines freundeskreises, unbedingt ein installationsmenü zu machen. zumal das 
1. überhaupt nicht die gestellte frage war....die blieb eigentlich völlig unbeachtet
2. du anscheinend selber gar nicht weisst, wie und womit man ein setup erstellt, und folge dem auch nicht ob der aufwand gerechtfertigt wäre.

so hast du in deiner argumentation durchaus sinnige argumente für ein installationsmenü gebracht, aber das ist für den fragenden wahrscheinlich genau so hilfreich, wie die information, dass dich dein modem frustriert.........
und siehe da, jetzt hab ich auch geschrieben obwohl das nix zur sache tut.
tschuldigung

eigentliche frage geht an kscha:
wie hast du es denn jetzt hinbekommen die entsprechenden dlls rauszufinden und einzulinken? ....hab das gleiche problem mit c# und VS.Net


----------



## new era (1. Oktober 2003)

Ich hatte auch das Prob und habe es jetzt gelöst! Aber in meinem Programm wir per Klick das CD Laufwerk geöffnet! Bei mir funktioniert das! Aber auf dem anderen Rechner nicht! Zum öffnen und schließen nehme ich den Code:

```
BOOL DoOpenCdRom(void) 
{ 
  char chrRc[256]; 
  char *ptrChrRc = &chrRc[0]; 
  return mciSendString("Set CDAudio Door Open\0",ptrChrRc,256,NULL); 
  
} 

BOOL DoCloseCdRom(void) 
{ 

  char chrRc[256]; 
  char *ptrChrRc = &chrRc[0]; 
  return mciSendString("Set CDAudio Door Closed\0",ptrChrRc,256,NULL); 
}
```
Was habe ich falsch gemacht?


----------



## chibisuke (2. Oktober 2003)

@new era: du steckst im falschen thread hier gehts um MFC-DLLs und nicht fehler in irgendwelchem code der zudem nichtmal was mit MFC zu tun hatt...

nun ein Setup erstellt man z.B. mit der GPL software "Inno-Setup"... eines der besten kostenlosen setup tools... macht das auch richtig professionell, und die bedienung is net schwer, zumal das inno script für das setup ähnlich aufgebaut ist wie ne ini datei...

MFC-DLLs statisch linken bringt insofern auch net wirklich viel, denn zur  not macht man es eben wie auch die VB programmierer es machen müssen... verweis auf die Microschrott homepage zum DL der passenden dlls...


----------



## new era (2. Oktober 2003)

Der Code is aus meinem MFC APP! Aba wenn du denkst das das kein MFC zeug is, dann denk ma schön weiter!


----------



## chibisuke (2. Oktober 2003)

nun ich weiß ja nicht was du unter MFC bezeichnest, aber MFC benutzt meines wissens klassen, klassen die nur in C++ verfügbar sind

und wenn ich mich nicht sehr täusche kann ich das code stück sogar mit einem ANSI-C kompiler kompilieren, darauf folgt das das nie und nimmer MFC ist,...

von dem ganz abgesehen benutzt man im MFC nie und nimmer char* sondern nur CString und mciSendString ist ganz eindeutig auch laut MSDN eine Windows API funktion...

und nun würdest du bitte die güte haben und damit n neuen thread aufmachen weil das gehöhrt hier nicht her, nichtmal wenn es MFC währe würde es hier her gehöhren


----------



## new era (2. Oktober 2003)

1. es is MFC, vielleicht klappt der Code auch unter WinApi oder sonst wo, aber bei mir is es nen Code in ner MFC Anwendung!

2. Ich hab schon nen neuen Thread erstellt!

Anscheinend hast du keine Ahnung von MFC und so! Sonst hättest du mir helfen können!

Greetz
new era


----------



## Daniel Toplak (3. Oktober 2003)

> 1. es is MFC, vielleicht klappt der Code auch unter WinApi oder sonst wo, aber bei mir is es nen Code in ner MFC Anwendung!    2. Ich hab schon nen neuen Thread erstellt!    Anscheinend hast du keine Ahnung von MFC und so! Sonst hättest du mir helfen können!


1. Es ist kein MFC, aber wenn du daruaf so bestehst, dann sag uns doch mal was an diesem CODE aus der MFC sein soll ?
2. Sehr gut mit dem neuen Thread
3. Ich glaube das beschimpfungen hier nicht sein müssen
Achja ich habe schon weit kompetentere Postings von "chibisuke" gelesen als von dir.

Gruss Homer


----------



## chibisuke (3. Oktober 2003)

> Anscheinend hast du keine Ahnung von MFC und so! Sonst hättest du mir helfen können!



Tja der der hier keine ahnung hatt von uns beiden der bist wohl schon du selbst, denn ich weiß das MFC nicht ohne class keyword im prototyp und ohne scope-resolutor bei der deklaration einer methode existieren kann.

Lass nich raten, nun kommt die frage was ein scope-resolutor is?
damit ist der :: operator gemeint der eine methode einer klasse oder einem namespace zuordnet..


----------



## new era (3. Oktober 2003)

ein scope resolutor ist z.B. das:

void CErrorDlg::OnRetry()

Ich weiß das ich kaum ahnung hab! Weil ich auch erst seit ner Woche damit arbeite!


----------



## new era (4. Oktober 2003)

Wo genau kann ich einstellen das die DLL's eingebunden werden?


----------

