Windows 7 dsound.dll从dll加载崩溃

3
我在Windows 7中从另一个DLL加载dsound.dll时遇到崩溃。以下代码会导致崩溃:
#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
文档中可以得知,你不应该从DllMain调用LoadLibrary

入口点函数应只执行简单的初始化或终止任务。它不能调用LoadLibrary或LoadLibraryEx函数(或调用这些函数的函数),因为这可能会在DLL加载顺序中创建依赖项循环。这可能导致系统在执行其初始化代码之前使用DLL。同样,在进程终止期间,入口点函数不能调用FreeLibrary函数(或调用FreeLibrary的函数),因为这可能会导致系统在执行其终止代码后使用DLL。

相反,您可以创建并导出一个初始化函数,并在加载DLL后调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接