C ++ LoadLibrary ERROR_NOACCESS "Неверный доступ к ячейке памяти". - PullRequest
6 голосов
/ 08 октября 2011

ОК, поэтому у меня есть ситуация, в которой я вызываю LoadLibrary для DLL, которую я написал.Этот вызов LoadLibrary возвращает ошибку # 998 или ERROR_NOACCESS «Неверный доступ к ячейке памяти».

В рассматриваемой DLL-библиотеке используется MFC в одной конфигурации, а не в другой;только конфигурация MFC имеет эту проблему.Это раньше работало , но я понятия не имею, что я изменил: я на самом деле перешел на версию без MFC и довольно много возился с этим, и я понятия не имею, что я мог бы сделатьэто повлияло на версию MFC.

Я не знаю много о DLL.Оригинальный загрузочный код был фактически передан мне, и я не изменил его.Ниже приведен код:

// 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

Очевидно, MFC определен в конфигурации MFC, а не иначе.

Я сомневаюсь, что этой информации достаточно для решения этой проблемы;Я понимаю это.На самом деле я надеюсь узнать , где искать проблемы , которые могут вызвать эту ошибку.Я буду рад предоставить любую необходимую вам информацию, как только узнаю, что она необходима.

Спасибо за любые советы.

1 Ответ

14 голосов
/ 11 октября 2011

ОК, на этот вопрос ответил мой друг (не знаю, есть ли у него учетная запись StackOverflow; он не собирается приставать к нему, отвечая на него дважды).

Дело в том, что у меня был глобальный объект, класс которого имел конструктор, который вызывал функцию, которая зависела от другого глобального объекта (как ни странно, рассматриваемая функция была _MESSAGE, но к тому времени DllMain или InitInstance вызывается, эта функция работает нормально). C ++ не позволяет вам указывать порядок инициализации глобалов, поэтому, когда запускался конструктор этого глобала (когда компьютер пытался загрузить DLL), он вызывал ошибку памяти, пытаясь использовать другой глобал, который не был создано еще.

Итак ... это ответ. Действительно конкретный случай, но я думаю, что если кто-то еще обнаружит, что он получает 998 ошибок и ему нужно знать, какие проблемы нужно проверить, это то, что нужно искать: убедитесь, что все ваши глобальные переменные независимы!

...