2010-02-18 58 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