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出错了。