使用WinAPI按名称获取进程中的指针变量

时间:2014-10-17 10:51:37

标签: c windows winapi

我不确定问题的标题有多清楚。这就是我想要做的事情:

我有一个使用DLL库作为插件的进程。这些库使用与临界区对象同步的函数。我希望所有DLL函数与相同的关键部分对象同步。我想到了以下内容:第一个DLL将初始化一个关键的section对象,而其他DLL也将使用它,而不是初始化一个新的。但是,如何获得指向第一个DLL的临界区对象的指针?

我想到的一个解决方案是使用Named Shared Memory,并将指针放在那里的临界区对象上。它会起作用,但感觉就像用火箭筒射击一只苍蝇。是否有一种更简单,更惯用的方法来创建一个带有可检索指针的命名对象?

2 个答案:

答案 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;
}