要同步寫入共享部分的多個進程,您需要某種IPC,例如, Windows事件,互斥體,套接字。每個模塊都調用CreateMutex並傳遞所有模塊共享的固定名稱。模塊然後調用WaitForSingleObject等待並聲明互斥鎖 - 當其中一個獲取它時,它可以在每個其他模塊等待時讀取/寫入共享部分。當它完成後,它會調用ReleaseMutex讓另一個模塊繼續運行。
說完所有我個人會堅持日誌文件。我猜你的問題是,對於DLL,你是基於父進程EXE名稱的日誌文件名而不是DLL自己的名字?
您可以通過存儲您在DllMain中傳遞的DLL實例句柄,然後將其與GetModuleFileName一起使用來獲取DLL自己的名稱。注意這適用於EXE以及如果您將實例句柄保留爲NULL。
// global variable to store DLL handle (or it stays NULL if this is an EXE)
HINSTANCE hDllHandle=NULL;
BOOLEAN WINAPI DllMain(IN HINSTANCE hInstance,
IN DWORD nReason,
IN LPVOID Reserved)
{
hDllHandle = hInstance;
return TRUE;
}
<snip>
void Log(LPSTR lpszMsg)
{
WCHAR szMyModuleName[MAX_PATH]={0};
// if hDllHandle is still NULL (e.g. this is an EXE) it returns the process name
// if non-NULL, it returns our DLL name
GetModuleFileName(hDllHandle, szMyModuleName, MAX_PATH);
fprintf(LOGFILE, "[%s] %s\n", szMyModuleName, lpszMsg);
....<snip>....
}
感謝您的信息。是的,這是我們陷入困境的地方。很難預測EXE的名稱,因爲DLL可以由任何ActiveX主機託管,雖然在這些情況下通常有一個「主」DLL ..這導致了我的共享數據部分的想法。我想我需要像'GetMainModuleFileName()'這將決定'主'DLL或使用EXE名稱,如果沒有一個..任何想法? – JBRWilkinson 2010-05-11 00:24:40
嗨 - 我上面發佈的代碼肯定會給你 - 如果它鏈接到一個運行在宿主進程中的DLL,它會告訴你你的DLL的名字,否則它會告訴你你的.exe的名字。道歉,如果我錯過了什麼。 – snowcrash09 2010-05-11 08:53:39
所以'主'DLL將有一個DllMain設置hDllHandle ..和其他DLL不。其他DLL的知道如何引用完全相同的hDllHandle變量? – JBRWilkinson 2010-05-11 19:22:53