我想向我的COM对象(DLL)添加日志记录支持,并且通常至少有两个此对象的实例已加载。我希望这两个DLL能够将行写入同一文本文件,但我担心这会给我带来问题。这有可能实现吗?我是否认为单个Windows API WriteFile
调用是原子的?两个进程可以打开同一个文件进行写入吗?
如果可能的话,我想在这里使用STL进行文件处理(std::ofstream
)。我的另一个想法是使用单独的每个DLL日志,但单个日志将更容易管理。
答案 0 :(得分:2)
#include <iostream>
#include <fstream>
#include <windosws.h>
struct Mutex {
Mutex () {
h = ::CreateMutex(0, false, "{any-GUID-1247965802375274724957}");
}
~Mutex () {
::CloseHandle(h);
}
HANDLE h;
};
Mutex mutex; // GLOBAL mutex
void dll_write_func() {
::WaitForSingleObject(mutex.h, INFINITE);
////////////////
// Write here
std::ofstrem f("output.txt");
f << "Test" << std::endl;
////////////////
::ReleaseMutex(mutex.h);
}
或者
struct MutexLock {
explicit MutexLock(Mutex & m) : m(m) {
::WaitForSingleObject(m.h, INFINITE);
}
~MutexLock() {
::ReleaseMutex(m.h);
}
Mutex & m;
};
void dll_write_func2() {
MutexLock mlock(mutex);
// Write here
std::ofstrem f("output.txt");
f << "Auto mutex Release" << std::endl;
}