多个DLL写入同一文本文件?

时间:2010-02-18 16:20:21

标签: c++ file stl

我想向我的COM对象(DLL)添加日志记录支持,并且通常至少有两个此对象的实例已加载。我希望这两个DLL能够将行写入同一文本文件,但我担心这会给我带来问题。这有可能实现吗?我是否认为单个Windows API WriteFile调用是原子的?两个进程可以打开同一个文件进行写入吗?

如果可能的话,我想在这里使用STL进行文件处理(std::ofstream)。我的另一个想法是使用单独的每个DLL日志,但单个日志将更容易管理。

1 个答案:

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