[C++] Linker Fehler beim erstellen einer DLL mit MFC (dllmain bereits definiert)

Kampfgnom

Lt. Commander
Registriert
Jan. 2005
Beiträge
1.075
Hallöle

Ich schreibe gerade an einem Miranda Plugin. Das ganze ist natürlich eine DLL. In meiner main.cpp habe ich dann um an die HINSTANCE zu kommen
Code:
BOOL WINAPI DllMain(HINSTANCE hinst,DWORD fdwReason,LPVOID lpvReserved)
{
	hinstance=hinst;
	return TRUE;
}
stehen.
Leider kriege ich folgenden Linker Fehler:
Code:
Linker-Vorgang läuft...
Bibliotheken werden durchsucht
    Durchsuchen von C:\Programme\Microsoft Visual Studio\VC98\LIB\msvcprt.lib:
    Durchsuchen von C:\Programme\Microsoft Visual Studio\VC98\MFC\LIB\mfc42.lib:
    Durchsuchen von C:\Programme\Microsoft Visual Studio\VC98\MFC\LIB\mfcs42.lib:
mfcs42.lib(dllmodul.obj) : error LNK2005: _DllMain@12 bereits in main.obj definiert
    Durchsuchen von C:\Programme\Microsoft Visual Studio\VC98\LIB\msvcrt.lib:
    Durchsuchen von C:\Programme\Microsoft Visual Studio\VC98\LIB\kernel32.lib:
.
.
.
    Durchsuchen von C:\Programme\Microsoft Visual Studio\VC98\LIB\kernel32.lib:
Durchsuchen der Bibliotheken abgeschlossen
mfcs42.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 bereits in main.obj definiert; zweite Definition wird ignoriert
   Bibliothek Release/ogame.lib und Objekt Release/ogame.exp wird erstellt
.
.
.
Release/ogame.dll : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
Fehler beim Ausführen von link.exe.

ogame.dll - 2 Fehler, 1 Warnung(en)
PS: gelinkt wird mit /verbose:lib. War irgendwo nen Tipp, damit man besser sehen kann welche Lib den Fehler verursacht. Bei mir ist es wohl die mfcs42.lib.

Ich habe schon folgende Seite gefunden, die das Thema im Groben abhandelt:
http://support.microsoft.com/default.aspx?scid=kb;en-us;148652

Leider kann ich den Tipp bei mir nicht anwenden, bzw ich bin zu dumm dazu.


Würde mich über jegliche Idee freuen...

EDIT: Ich verwende, wie man an den Fehlermeldungen wohl sieht, MSVC++ 6.0

mfg
 
Wo ist denn das Problem mit dem MSDN-Link? :)

Englisch? Die Einstellungen? Ich fand das jetzt erstmal soweit verständlich..
 
Nein mein Englisch ist in der Tat ziemlich gut. :p
Der Unterschied zwischen meinem Problem und dem von Microsofts Hilfe Seite ist ganz einfach dass die eine DLLMain in zwei verschiedenen Libs haben...
mfcs40d.lib(dllmodul.obj): error LNK2005: _DllMain@12 already defined in
MSVCRTD.LIB

die mfcs42d.lib und die MSVCRTD.LIB. Die müssen also die Reihenfolge dieser Libs ändern, soweit ich das verstanden habe...

bei mir ist es nun aber so dass ich einmal eine DLLMain in der mfcs42d.dll und eine zweite in meiner eigenen cpp sprich der main.obj habe.

nur: wie soll ich bitte die reihenfolge von mfc.lib und main.obj ändern??
ich hab da schon ne weile rumprobiert, bin aber zu keinem zufriedenstellenden ergebnis gekommen.


danke fürs sich annehmen des problems

mfg
 
Hmm... es gibt doch sicherlich viele Miranda-Plugins im Sourcecode. Schau dir doch mal ein anderes Projekt an und guck, wie es dort gemacht wurde. Afaik gibt es für Miranda-Plugins doch auch schon ein Grundgerüst als VC Projekt :)
 
Meinst du wirklich ich würde einfach mal so raten wie man Plugins macht? Der für Miranda relevante Code ist zZ noch zu knapp 100% kopierter Code... ;) Da sind keine Fehler drin.

Das Problem ist ja das verdammte mfc in verbindung mit Dlls. Ich habe schon nach Plugins gesucht, die es auch verwenden, aber keins gefunden. Auch weil man so schlecht danach suchen kann, ob ein Plugin mit mfc geschrieben wurde.
Der Fehler müsste doch eigentlich recht häufig auftreten, quasi immer wenn man eine DLL mit MFC erstellen will... Deswegen wundere ich mich dass ich nicht exakt das selbe Problem bei Google finde.

Den MFC-Code krieg ich aus dem Projekt nicht mehr raus, da ist nichts zu machen.

naja. weitere Ideen?

mfg
 
Ich vermute einfach mal das Du den falschen Projekttyp hast. Leg doch mal eine neue MFC DLL an und baue diese auch. Wenn das geht, ersetze einfach sukzessive alle Dateien mit Deinen eigenen.

MfG

Arnd
 
wenn du keine ahnung von den mfc hast tu dir einen gefallen und lass die finger davon. es gibt wohl keine bibliothek die so schlecht ist wie diese, sie zu lernen hat absolut keinen sinn, ausser du brauchst sie unbedingt für deinen job(da das aber nach nem privaten projekt aussieht geh ich mal nicht davon aus das das nötig ist).

wenn es doch unbedingt die mfc sein sollen besorg dir drigend ein buch dazu. die mfc sind komplex, und du bist über den ersten großen fehler gestolpert:

definiere NIEMALS dein eigenes (dll)main in mfc programmen. die mfc enthält bereits die (dll)main funktion. du solltest stattdessen die entsprechenden klassen benutzen(visual studio sollte dier für dich anlegen. meine mfc zeit ist lange her, aber ich glaube CWinApp wäre hier die richtige). die instance lässt sich über diese klasse bekommen.

ein paar weiterführende links:
http://msdn.microsoft.com/library/d.../vclib/html/_mfc_cwinapp.3a3a.m_hinstance.asp
http://support.microsoft.com/kb/q148791/

aber wiegesagt, bitte schau dir die mfc gründlich an wenn du sie behalten willst. für die funktionalität die sie liefernn sind sie unglaublich komplex. einfach mal so ein mfc programm zusammen basteln wird ganz sicher nicht funktionieren.
 
Zuletzt bearbeitet:
Also ich wende die MFC seit einigen Jahren an. Ich kann zwar bestätigen das das intern alles ziemlich kompliziert ist, aber ich kenne keine Bibliothek mit der man so einfach und schnell etwas funktionierendes zusammenbasteln kann. Sicher auch weil ich damit angefangen habe :-). Es ist halt MS und damit quick and dirty aber es läuft.

Und auch eine MFC DLL hat eine DLLMain nur das diese nicht ganz so einfach aufgebaut ist und man bei Verwendung von MFC Klassen ziemlichen Aufwand treiben muss.

Von daher ist eine MFC DLL nicht unbedingt die beste Idee, auch wenn es geht.

MfG

Arnd
 
Ich will sie absolut nicht behalten. Ich brauchte in dem Projekt nunmal HTTP Verbindungen. In einem anderen Sourcecode habe ich dann gesehen wie ungefähr das gleiche mit der Klasse CInternetConnection gelöst wurde, und den Code habe ich dann zum größten Teil übernommen und umgeschrieben.
CInternetConnection ist (anscheinend leider) das erste was das MSDN ausspuckt wenn man mit HTTP-Connections arbeiten will. Dass MFC so schwer und komplex ist konnte ich ja nicht ahnen, sowas merkt man ja nicht wenn man nur eine Klasse daraus verwendet.

Wenn mir dann jetzt noch einer nen kurzes Stichwort zum Thema HTTP-Connections (insbesondere mit POST-Requests) gibt, kann ich ja das ganze Zeugs doch mal da rausprogrammieren. Inzwischen sollte das glaube ich schneller gehn als diesen Linkerfehler da rauszukriegen.
Ein kurzes Stichwort, mit dem man gut suchen kann, reicht mir vollkommen...

danke schonmal für alles
mfg
 
Hallo Kampfgnom,

also nur wegen dem HTTP Protokoll die MFC anziehen, das lohnt sich nicht bzw. schafft mehr Ärger als das es was nutzt.

Ich würde einfach ganz simple sockets nehmen und darüber die Kommandos absetzen.
D.h. die Stichworte für dich sind:

- socket
- bind
- setsockopt
- connect
- send

Damit stellst Du eine socket Verbindung her. Über die wird dann ganz einfach der POST Request als Klartext gesendet. Ganz ohne MFC.

Das ist dann zwar erst mal eine Bildschirmseite Code nur um eine Socket Verbindung herzustellen im Gegensatz zu ein paar Zeilen MFC. Ist aber wesentlich einfacher zu handhaben.

MfG

Arnd

PS: MFC ist nicht schwer und komplex, man muss es eben lernen wie alles andere auch.
 
Zuletzt bearbeitet:
Arnd schrieb:
Also ich wende die MFC seit einigen Jahren an. Ich kann zwar bestätigen das das intern alles ziemlich kompliziert ist, aber ich kenne keine Bibliothek mit der man so einfach und schnell etwas funktionierendes zusammenbasteln kann. Sicher auch weil ich damit angefangen habe :-). Es ist halt MS und damit quick and dirty aber es läuft.

Und auch eine MFC DLL hat eine DLLMain nur das diese nicht ganz so einfach aufgebaut ist und man bei Verwendung von MFC Klassen ziemlichen Aufwand treiben muss.

Von daher ist eine MFC DLL nicht unbedingt die beste Idee, auch wenn es geht.

MfG

Arnd

das ist wohl ansichtssache. aber ein hello world hat mit qt maximal 10 ziemlich kurze zeilen, mit den mfc brauch ich fast 10 "volle" dateien damit das ganze noch halbwegs übersichtlich bleibt ;). auch wenn davon das meiste vom codegenerator stammt, das ist einfach nicht schön. ich finde die mfc einfach nur komppliziert. im grunde eine klassenbibliothek zum kapseln der diversen winapi zeiger die aber überall mit komplizierten konzepten durchzogen ist, die für kleine programme kein mensch braucht. schon aleine das model-view zeugs erzwingt soviel overhead das ich die mfc für kleine projekte als absoluten overkill ansehe - und für große fehlt einfach die funktionalität(viel mehr als winapi mit einer halbwegs ordentlichen c++ api ist es dann eben doch nicht).


@topic:
wenn du einfache klassen für das gui zeugs von windows haben willst würde ich dir ansonsten die wtl empfehlen. auch nicht gerade schön, aber wenigstens auch nicht kompliziert. genau das richtige für kleine win projekte. mein letztes wtl projekt ist auch schon eine weile her, eventuell haben die mitlerweile sogar socket klasen? oder sind die schon in der atl drin? ist auf jedenfall einen blick wert.
 
Zuletzt bearbeitet:
Hmm,

also ohne Codegenerator bekomme ich ein Hello World in MFC sicher auch in ein paar Zeilen hin.

Aber ist es wie Du gesagt hast Ansichtssache. Wer will soll Qt benutzen und wer will MFC.

MfG

Arnd
 
Jo dann bedanke ich mich bei euch allen, und werde mir mal Sockets ordentlich angucken.

Windows Oberflächen brauch ich grad nicht so wirklich, da liefert die Miranda-API schon genug Funktionen und Beispielcode mit. Ich muss ja quasi nur nen Optionen-Fenster generieren. Das geht einfach mit ner Resourcen Datei...
Auf jeden Fall ziemlich einfach.

also vielen Dank
mfg
 
Zurück
Oben