Загрузка Windows 7 dsound.dll от падения DLL - PullRequest
3 голосов
/ 28 апреля 2010

У меня сбой при загрузке dsound.dll из другой библиотеки DLL в Windows 7. Сбой следующего кода:

#include <Windows.h>
#include <mmreg.h>
#include <dsound.h>
#include <assert.h>

HRESULT (WINAPI *pDirectSoundEnumerateA)(LPDSENUMCALLBACKA pDSEnumCallback, LPVOID pContext);
HMODULE hDsound;
BOOL CALLBACK DSEnum(LPGUID a, LPCSTR b, LPCSTR c, LPVOID d)
{
    return TRUE;
}
void CrashTest()
{
    HRESULT hr;
    hDsound = LoadLibraryA("dsound.dll");
    assert(hDsound);
    *(void**)&pDirectSoundEnumerateA = (void*)GetProcAddress(hDsound, "DirectSoundEnumerateA");
    assert(pDirectSoundEnumerateA);
    hr = pDirectSoundEnumerateA(DSEnum, NULL);
    assert(!FAILED(hr));
}
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
        CrashTest();
    }
}

с этим кодом ошибки:

Unhandled exception at ... in ...: 0xC0000005: Access violation reading location 0x00000044.

(по какой-то причине это всегда 0x44). Он работает в Windows XP или при загрузке непосредственно из .exe (не из отдельной DLL). Помогите!?! :)

1 Ответ

3 голосов
/ 28 апреля 2010

Никогда не звоните LoadLibrary с DllMain. Из документации :

Функция точки входа должна выполнять только простые задачи инициализации или завершения. Он не должен вызывать функцию LoadLibrary или LoadLibraryEx (или функцию, которая вызывает эти функции), поскольку это может создать циклы зависимости в порядке загрузки DLL. Это может привести к использованию DLL до того, как система выполнит свой код инициализации. Аналогично, функция точки входа не должна вызывать функцию FreeLibrary (или функцию, которая вызывает FreeLibrary) во время завершения процесса, поскольку это может привести к использованию DLL после того, как система выполнила свой код завершения.

Вместо этого вы можете создавать и экспортировать функцию инициализации и вызывать ее после загрузки DLL.

...