Несколько DLL записывают в один и тот же текстовый файл? - PullRequest
1 голос
/ 18 февраля 2010

Я хочу добавить поддержку журналирования в мой COM-объект (DLL), и обычно загружается как минимум два экземпляра этого объекта. Я хочу, чтобы обе библиотеки DLL могли записывать строки в один и тот же текстовый файл, но я обеспокоен тем, что это может вызвать проблемы. Можно ли этого достичь? Правильно ли я считаю, что один вызов Windows API WriteFile является атомарным? Могут ли два процесса открыть один файл для записи?

Я бы хотел использовать STL для обработки файлов здесь (std::ofstream), если это возможно. Моя другая идея состоит в том, чтобы использовать отдельный журнал для каждой DLL, но одним журналом было бы намного легче управлять.

1 Ответ

2 голосов
/ 18 февраля 2010
#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...