我不确定问题的标题有多清楚。这就是我想要做的事情:
我有一个使用DLL库作为插件的进程。这些库使用与临界区对象同步的函数。我希望所有DLL函数与相同的关键部分对象同步。我想到了以下内容:第一个DLL将初始化一个关键的section对象,而其他DLL也将使用它,而不是初始化一个新的。但是,如何获得指向第一个DLL的临界区对象的指针?
我想到的一个解决方案是使用Named Shared Memory,并将指针放在那里的临界区对象上。它会起作用,但感觉就像用火箭筒射击一只苍蝇。是否有一种更简单,更惯用的方法来创建一个带有可检索指针的命名对象?
答案 0 :(得分:3)
一个Dll应负责管理关键部分对象。 此dll还可以导出函数以使用它。 这个dll应该在加载期间创建对象,并提供(导出)一个返回对象指针的函数。
答案 1 :(得分:2)
使用命名的互斥锁。您不必跨越DLL边界传递它。每个DLL都可以单独调用CreateMutex()
,指定相同的名称,并且每个DLL都会将自己的本地HANDLE
添加到内核中的相同互斥对象,从而允许彼此同步。只需确保每个DLL在使用互斥锁完成时调用CloseHandle()
。两者兼顾的最佳位置是每个DLL的入口点函数,例如:
HANDLE hMutex = NULL;
BOOL WINAPI DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
hMutex = CreateMutex(NULL, FALSE, TEXT("MySharedMutex"));
if (hMutex == NULL) return FALSE;
break;
case DLL_PROCESS_DETACH:
if (hMutex != NULL)
{
CloseHandle(hMutex);
hMutex = NULL;
}
break;
}
return TRUE;
}