C++ LoadLibrary ERROR_NOACCESS "Ungültiger Zugriff auf Speicherbereich."
OK, also ich habe eine situation, in der ich nenne LoadLibrary
auf eine DLL, die ich schrieb. Dieser Aufruf von LoadLibrary zurückgegeben Fehler #998, oder ERROR_NOACCESS
"Ungültiger Zugriff auf Speicherbereich."
Die DLL in Frage MFC verwendet, die in einer Konfiguration, und in der anderen nicht; nur die MFC-Konfiguration hat dieses problem. Es verwendet, um die Arbeit, aber ich habe keine Ahnung, was ich geändert habe: ich würde sogar weiter, um die nicht-MFC-version und seit neuestem Recht viel mit, und ich habe keine Ahnung was ich getan haben könnte, dass die betroffenen die MFC-version.
Ich weiß nicht viel über DLLs. Der original-code laden war eigentlich, die mir gegeben, und ich habe Sie nicht geändert. Unten ist das code:
//submodule loading
#ifndef MFC
//Project uses standard windows libraries, define an entry point for the DLL to handle loading/unloading
BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
_MESSAGE("DllMain called.");
switch(dwReason)
{
case DLL_PROCESS_ATTACH: //dll loaded
hModule = (HMODULE)hDllHandle; //store module handle
_MESSAGE("Attaching Submodule ...");
break;
case DLL_PROCESS_DETACH: //dll unloaded
_MESSAGE("Detaching Submodule ...");
break;
}
return true;
}
#else
//Project uses MFC, we define here an instance of CWinApp to make this a 'well-formed' DLL
class CSubmoduleApp : public CWinApp
{
public:
virtual BOOL InitInstance()
{//dll loaded
hModule = m_hInstance; //store module handle
_MESSAGE("Attaching Submodule ...");
return true;
}
virtual int ExitInstance()
{//dll unloaded
_MESSAGE("Detaching Submodule ...");
return CWinApp::ExitInstance();
}
} gApp;
#endif
Offensichtlich MFC
definiert ist, die in der MFC-Konfiguration, und nicht anders.
Bezweifle ich, das ist genug Informationen, um dieses problem zu lösen; ich merke, dass. Was ich eigentlich gehofft zu erfahren, ist , wo Sie zu suchen für Probleme, die, die möglicherweise diesen Fehler verursachen. Ich werde glücklich sein, zu liefern alle Informationen, die Sie brauchen—, wenn ich weiß, es ist notwendig.
Vielen Dank für alle Tipps.
Man kann sicherlich führen diese unter dem debugger. Sie müssen einen break-Punkt schön und früh in den code und vergeben Sie einen host-Anwendung.
Haben Sie versucht, das laden der DLL aus dem test-Programm, statt aus dem original-host-Programm? Wenn Sie Glück haben, wird es zeigen den gleichen Fehler, was würde das Debuggen viel einfacher.
Vielleicht, aber wenn der Fehler Auftritt, sobald die DLL geladen, es wird nicht keinen Unterschied machen, oder?
DllMain (und damit vermutlich auch die InitInstance) ist ein Sonderfall; code, der perfekt funktioniert, auch anderswo brechen könnte beim Aufruf von DllMain aufgerufen.
InformationsquelleAutor KRyan | 2011-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, diese Frage wurde beantwortet von einem Freund von mir (keine Ahnung, ob er einen StackOverflow account; nicht zu gehen belästigen ihn mit der Beantwortung es zweimal).
Den deal ist, dass ich musste ein globales Objekt, die Klasse, die einen Konstruktor, der aufgerufen, eine Funktion, die hing auf die anderen globalen Objekt (ironischerweise ist die Funktion in Frage
_MESSAGE
, sondern durch die ZeitDllMain
oderInitInstance
aufgerufen wird, die Funktion funktioniert einwandfrei). C++ erlaubt es Ihnen nicht, um die Reihenfolge festzulegen, in dem globals-get initialisiert, so dass, wenn diese Globale Konstruktor got run (wenn der computer versucht, um die DLL zu laden), es verursacht einen Speicherfehler, indem Sie versuchen, verwenden Sie eine andere Globale, nicht gewesen, die noch erstellt.Also... das ist die Antwort. Ein wirklich spezieller Fall, aber ich denke, wenn jemand findet Sie immer sind 998 Fehler und müssen wissen, welche Arten von Problemen zu überprüfen, das ist etwas zu suchen: stellen Sie sicher, dass alle globalen Variablen sind voneinander unabhängig!
OK, ich wusste nicht, dass (und ich denke mein Freund auch nicht). Punkt ist, ich war nicht mit Ihnen. Ich werde in diesem Blick.
ein Verweis wäre sinnvoll.
Dieser arbeitete für mich. Hatte einen Zeiger Fehler in der statischen Initialisierungen in der DLL, die nur noch ausgelöst, während eine manuelle LoadLibrary () - Aufruf nicht, ob die Verlinkung direkt über die DLL importieren Bibliothek.
Ich wünschte, ich hätte dies Lesen, vor 5 Stunden.
InformationsquelleAutor KRyan