Для синхронизации нескольких процессов записи в общий раздел вам понадобится какой-нибудь IPC, например События Windows, мьютексы, сокеты. Каждый из ваших модулей вызывает CreateMutex и передает фиксированное имя, которое разделяют все модули. Затем модули вызывают WaitForSingleObject, чтобы ждать и запрашивать мьютекс - когда один из них получает его, он может читать / записывать раздел с общим доступом, пока все остальные модули ждут. Когда это сделано, он вызывает ReleaseMutex, чтобы позволить другому модулю идти.
Сказав все это лично, я бы продолжил с лог-файлами. Я предполагаю, что ваша проблема в том, что для библиотек DLL вы основываете имя файла журнала на имени EXE родительского процесса, а не на собственном имени библиотеки DLL?
Вы можете получить собственное имя библиотеки DLL, сохранив дескриптор экземпляра DLL, переданный в DllMain, и затем используя его с GetModuleFileName. Обратите внимание, что это работает и для 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>....
}