Kann nicht durch "DllMain bereits definiert" - Fehler
Ich versuche zu schreiben .dll-Bibliothek für .dll-injection-Zwecke. Und aufgrund dieser Tatsache, Sie müssen eine routine DllMain aufgerufen, denn dies ist, was verwendet werden, als der Einstiegspunkt. Ich denke mein problem kann sich ergeben aus der Tatsache, dass ich verlinkt bin, in eine statische Bibliothek, ich habe geschrieben was nutzt eine threads und Mutexe von afxmt.h. Weil irgendwo hinunter die Linie, die die Inklusion der dadurch verursacht wird, dass der linker für die Verknüpfung von mfcs100ud.lib, die offenbar enthält seine eigene version von DllMain.
Hier ist die Datei, gebe mir Mühe:
dllmain.cpp
#include "stdafx.h"
#include <stdio.h>
#include "NamedPipeLogger.h"
static CNamedPipeLogger m_PipeLogger("Log.txt");
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
}
Hier ist die stdafx.h-Datei, die dllmain.cpp ist darunter.
stdafx.h
#pragma once
#define _AFXDLL
#include <Afx.h>
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN //Exclude rarely-used stuff from Windows headers
Hier ist meine Fehlermeldung:
Fehler 32 error LNK2005: _DllMain@12 bereits in
dllmain.obj D:\xxxxx\xxxxx\xxxxxx\mfcs100ud.lib(dllmodul.obj)
Bin ich schraubte hier, weil ich nicht ändern kann, den Namen meines Dll Einstiegspunkt, um etwas anderes als DllMain?
dllmodul(e)
aus? Es ist sehr wahrscheinlich, dass dein static library enthält eine DllMain-und das ist das problem, sondern als MFC. Dieser spezielle Fehler fast nur passiert, wenn Sie eine Art von Projekt, und ändern Sie es später, oder schlüpfen Sie einige Einstellungen oder code in sonst; es wird nicht nur angezeigt, in neue Projekte und ist leicht zu beheben, sobald Sie die Quelle.Ich bin mir nicht sicher, was du damit meinst dllmodul(e), aber die NamedPipeLogger.h-Datei, der code kommt von einer statischen lib, die ich schrieb. Es ist ein Gewinde-log-Datei-Schreiber, der eine Verbindung zu einer named pipe. Es nutzt Mutexe und threads, so muss ich das include <afxmt.h>, <afxwin.h> und <afxmt.h>. Wie kann ich überprüfen, um zu sehen, ob meine statische Bibliothek enthält eine DllMain? Ich schrieb die Sache, damit ich weiß, dass ich nicht erklären oder gar Referenz ist eine DllMain, also ich weiß nicht, wie es sein könnte, aus dieser lib.
Ist Ihre statische Bibliothek Verknüpfung zur MFC? Wenn ja, was ist die Einstellung für "Use of MFC" im Konfigurations-Eigenschaften?
Überprüfen, um sicherzustellen, gibt es nicht eine Funktion mit diesem Namen, überprüfen Sie die linker-Einstellungen und stellen Sie sicher, dass es nicht automatisch hinzufügen (falls ein Projekt ist/war gebaut wie eine DLL, wird der Eintrag Hinzugefügt werden standardmäßig, wenn nicht gefunden), stellen Sie sicher, dass Sie sauber und neu erstellen der Bibliothek, ohne DllMain (und überprüfen Sie alle anderen Bibliotheken, die Sie sind), dann neu erstellen Ihre app. Jedes mal, wenn ich gesehen habe, das war eine alte Einstellung, die über Links in einer Bibliothek, und immer von mir (oder zumindest, nie system-Bibliotheken).
Ich sehe. Ja, die statische Bibliothek wurde ursprünglich als eine dll. Es scheint die einzige Möglichkeit zu sein das Projekt beginnt. Das erste, was ich Tat, war jedoch ändern, um eine statische Bibliothek. Wissen Sie, wo diese Einstellung ist, die ich Suche. Ich bin mit Visual Studio 2010. Ich bin nicht zu sehen, etwas, das aussieht wie die "entry point" - Konfigurationen.
InformationsquelleAutor Ultratrunks | 2012-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
In vielen Fällen ist dies dadurch verursacht, dass _USRDLL in der Präprozessor-Einstellungen, wo es sein sollte _LIB. Dies hat zu tun mit "MFC-Erweiterungs-dlls", die ich glaube nicht, dass noch jemand macht heute noch den VS-Assistenten anzunehmen scheint, die Sie wollen, zu verwenden, wenn Sie überprüfen Sie "Verwendung von MFC" in der Assistenten.
InformationsquelleAutor Roel
Kürzlich erlebte ich das gleiche oder ein ähnliches Problem und eine Lösung gefunden.
Hintergrund
Ich habe ein MFC-Projekt in Visual Studio 2013 Pro, das erzeugt eine DLL. Ich habe mehrere .c-Module in das Projekt, das ich in der Lage bin zu tun, indem Sie bedingt Angabe der "extern " C"' konstruieren, vorkompilierte Header deaktivieren für diejenigen C-Dateien, und - in meinem Fall - Deaktivierung geerbt gezwungen umfasst, die wurde gezogen-in stdafx.h aus den Projektvorgaben.
Problem
Eines Tages, nachdem er verwendet diese Methode erfolgreich auf mehrere C-Dateien, wenn ich versuchen würde, zu fügen gerade einen mehr, würde ich die folgende Fehlermeldung erhalten.
Lösung
Ich dieses Problem gelöst, durch die Umsetzung von "Solution One" von Microsoft Knowledge Base-Artikel Q148652, "Ein LNK2005 Fehler tritt auf, wenn die CRT-Bibliothek und MFC-Bibliotheken verknüpft sind, in der falschen Reihenfolge in Visual C++". Dies zwingt den linker die Verknüpfung der Bibliotheken in der richtigen Reihenfolge.
Schritte:
Basiert auf dem Code Project Artikel Lösen error LNK2005: _DllMain@12 bereits in msvcrtd.lib(dllmain.obj) in MFC-Projekten", ich denke, ich könnte hinzufügen, eine weitere Bibliothek, die Liste eines Tages, aber so viel arbeitet für mich für jetzt.
InformationsquelleAutor cp.engr
Gut, ich denke, dass ich das Handtuch warf, auf diese (Art von). Ich war in der Lage, zumindest bekommen alle meine Probleme. Ich musste einfach aufhören, einige der Microsoft-Klassen.
Ich berührte das in der Beschreibung von dem problem, aber ich erinnere mich daran ab, haben Schwierigkeiten mit dem kompilieren, sobald ich begann, einschließlich:
So, ich ging durch und fanden heraus, was genau ich mit war erforderlich, dass diese umfasst. Ich war mit dem AfxBeginThread() Methode, und die Klassen CMutex und CCriticalSection. Also dachte ich, dass vielleicht, wenn ich könnte nur erhalten, Weg von den proprietären windows-Zeug, dass vielleicht meine Probleme Weggehen würde. Das bedeutet, die Beseitigung aller gehören , , und dann die Adresse der Kompilierung Fehler mit mehr standard-c++ - code. Hier ist was ich getan habe:
Dann war ich in der Lage zu kompilieren .dll und es funktioniert gut.
CreateThread
undCRITICAL_SECTION
sind "standard" als das, was Sie verwenden. Nichts, was Sie tun, ist die Norm; es ist eine Windows-spezifische von A bis Z. (nichts ist schief mit, dass, aber Sie sollten sich dessen bewusst sein.)Nun, es erfordert nicht die Anwendung, die Framework-eXtention-Header (afx), das wurde mir Mühe gegeben, mit geheimnisvollen dlls während der link-Zeit. Das ist es, was ich wollte.
InformationsquelleAutor Ultratrunks
Bekam ich die Fehlermeldung, wenn ich umgezogen
#include afxdllx.h
aus dllmain.cpp zu StdAfx.h. Mein Projekt funktioniert ohne diese auchInformationsquelleAutor user7428175