【问题标题】:Windows 7 dsound.dll load from dll crashWindows 7 dsound.dll 从 dll 崩溃加载
【发布时间】:2011-02-13 08:25:36
【问题描述】:

在 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)加载时。帮助!?! :)

【问题讨论】:

    标签: c dll windows-7 crash


    【解决方案1】:

    您永远不应该从DllMain 拨打LoadLibrary。来自documentation

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2017-01-16
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多