我已经实现包括的DllMain()入口函数的DLL: -FreeLibrary则VS隐含卸载DLL
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
case DLL_PROCESS_ATTACH:
/* here im doing file memory mapped through CreateFileMapping() API
and using it through MapViewOfFile() API
storing some data structure in the file mapped area */
...
case DLL_THREAD_ATTACH:
...
case DLL_THREAD_DETACH:
...
case DLL_PROCESS_DETACH:
/* Here unmapping first through UnmapViewOfFile() API
then tries to access the stroed data structure which is illegal
as we have already closed the file mapping
This is the buggy code. The order should be first access the mapped memory
region and then unmap it */
cout <<" some message"<<endl;
...
}
不幸的是我取得了DLL_PROCESS_DETACH情况和访问非法memorey(访问冲突)错误。
我做了一个示例程序,它使用LoadLibrary()函数加载库,使用库函数并最终调用FreeLibrary()并返回。
当我执行这个程序,我没有得到任何错误消息。 但是,如果我删除FreeLibrary(),在这种情况下,DLL_PROCESS_DETACH情况隐式执行,并且这次它提供错误对话框提及存在访问冲突。
为什么调用FreeLibrary()压制这个错误?或内部它处理这个异常? 建议的方式是什么。
更新:我添加了ATTACH和DETACH的详细信息。可能它会帮助我为什么不清楚所观察到的行为。 使用FreeLibrary()调用,我没有得到任何错误消息,但没有显示cout消息。它似乎也崩溃了,但没有被破坏。 但是,如果我删除FreeLibrary(),在这种情况下DLL_PROCESS_DETACH情况隐式执行,并提供访问冲突对话框。 理想情况下在前一种情况下,它应显示错误。所以我猜测FreeLibrary()会抑制这个访问冲突错误。
让我们假设在DLL_PROCESS_DETACH中我释放了内存然后访问它。所以你说的不是这里的情况。 – Adil 2010-04-28 05:18:17
也许你应该发布你的实际代码,所以我们不必猜测? – 2010-04-28 05:30:55
添加完整的源代码将会太大。我在帖子中添加了一些细节。请参阅,希望它有助于我的怀疑。 – Adil 2010-05-05 18:24:35