FreeLibrary()访问冲突

时间:2014-05-07 10:34:08

标签: c++ dll

Follwing Code应使用.dll扫描目录以获取插件容器。如果遇到非Container .dll,它会在给定位置崩溃并出现访问冲突异常 (在0x00000000处执行)。我很确定这不是溢出错误或类似错误,因为它在加载后立即被释放。我可以保证没有一个dll函数调用。只有GetProcAddress试图找出我的插件发现的入口点。

这里还有什么问题?可能是我释放了一个我的plugin-dll内部链接到的模块吗?如果是这样,我怎么能检测到这种情况,并选择在这种情况下不调用FreeLibrary?

string filePathStr (path);
string fileSearchKey = filePathStr + "\\*.dll";
WIN32_FIND_DATAA fd;
HMODULE hmod;
bool bFirstRun = true;
bool bFinishedRun = false;
HANDLE h = INVALID_HANDLE_VALUE;
printf("\r\n");
while (!bFinishedRun)
{
    if (bFirstRun)
    {
        h = FindFirstFileA(fileSearchKey.c_str(), &fd); 
        bFirstRun = false;
    } else
    {
        if (FindNextFileA(h, &fd) == FALSE) bFinishedRun = true;
    }

    if (!SetDllDirectoryA(filePathStr.c_str())) break;  

    hmod = LoadLibraryA(fd.cFileName);
    if (!hmod) continue;

    rpiRegisterPluginsCall prpiRegisterPlugins = reinterpret_cast<rpiRegisterPluginsCall>(GetProcAddress(hmod, "_rpiRegisterPlugins@4"));
    if (prpiRegisterPlugins == NULL)
    {
        FreeLibrary(hmod); // Access violation
        continue;
    }
    if (prpiRegisterPlugins(this) != 0)
    {
        FreeLibrary(hmod);
        continue;
    }

    m_loaded.push_back((unsigned long long)hmod);

}

编辑:

显然,在许多非容器中只有一个违规的.dll(删除了一个并且它可以工作)。所以我选择解释dllmain出错了。

0 个答案:

没有答案