2010-02-18 130 views
1

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

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

回答

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; 
} 
+0

辉煌!谢谢! – Rob 2010-02-18 20:31:29