2016-01-20 52 views
0

我正在寫一個主應用程序可執行文件的日誌文件,我希望附加的可執行文件也要附加到該日誌文件中。我有CreateFileEx從所有可執行文件打開並正確寫入,但是當子可執行文件寫入該文件(並且成功),然後父文件寫入該文件後不幸地覆蓋了該子文件的內容。例如...Win32日誌文件附加共享進程寫入

1) Parent opens log. 
2) Parent writes 'Line A' to log 
    Log: 'Line a\n' 
3) Parent launches child executable 
4) Child writes 'Child Line A' to log 
    Log: 'Line A\nChild Line A\n' 
5) Parent writes 'Line B' to log. 
    Log: 'Line A\nLine B\n 

我一直在使用LockFileEx/UnlockFileEx(設置爲0的偏移和長度MAXDWORD),甚至試圖SetFilePointer到指針移動到結束都沒有成功。即在上面的寫作序列中將等同於。

a) LockFileEx 
b) SetFilePointer 
c) ... write data ... 
d) UnlockFileEx 

注:我添加了正確的權限,如無緩衝,當我打開文件等,甚至試圖FlushFileBuffers沒有成功。

我會假設父文件HANDLE不知道更改,因此SetFilePointer(fHandle,0,NULL,FILE_END)認爲它已經在最後。

任何想法?

在此先感謝 蒂姆 -

+0

出現這種情況,而不是使用經過充分測試的系統服務,當您試圖推出自己的。 [Windows的事件跟蹤](https://msdn.microsoft.com/en-us/library/windows/desktop/bb968803.aspx),您正在嘗試實施什麼。 – IInspectable

回答

0

我不知道什麼是錯與您的代碼,你就必須提供其整個實現 - 僞代碼描述太少。我的建議是,而不是使用文件鎖定,使用正常的常規文件追加互斥體,你可以使用包裝類CMutexEx和CMutexExHelper如下然後記錄將如下所示:

CMutexEx mtx("myapplogmutex", 250); 
    CMutexExHelper mthHelper(mtx); 
    if (mthHelper.Aquire()) { 
    // Log to file, open it and after appending close 
    } 

我不知道如何這將是有效的,但至少應該是安全的。

執行情況CMutexEx和CMutexExHelper:

class CMutexEx { 
public: 
    HANDLE hMutex; 
    DWORD dwWait; 

    explicit CMutexEx(const TCHAR* szName, DWORD dwWait=25) : hMutex(0) { 
    hMutex = CreateMutex(NULL, FALSE, szName); 
    this->dwWait = dwWait; 
    } 

    bool Aquire() {  
    if (!hMutex) return false; 

    DWORD dwWaitResult = WaitForSingleObject(hMutex, dwWait); 
    if (dwWaitResult != WAIT_OBJECT_0) 
     return false; 
    return true; 
    } 

    void Release() { 
    if (hMutex) 
     ReleaseMutex(hMutex); 
    } 

    ~CMutexEx() { 
    CloseHandle(hMutex); 
    } 
}; 

class CMutexExHelper { 
    CMutexEx& mtx; 
public: 
    CMutexExHelper(CMutexEx& p_mtx) : mtx(p_mtx) { 
    } 
    bool Aquire() {  
    return mtx.Aquire(); 
    } 
    ~CMutexExHelper() { 
    mtx.Release(); 
    } 
};