2011-10-08 52 views
2

我有一個文件映射類,允許我使用Win32 API函數LockFileEx()也鎖定爲獨佔使用的文件通過我的過程。訪問衝突調用LockFileEx時()

bool FileMapping::lockFile(bool wait) { 
    if (isFileLocked()) 
     return true; 

    // We want an exclusive lock. 
    DWORD flags = LOCKFILE_EXCLUSIVE_LOCK; 

    // If we don't want the thread to block, we have to set the appropriate flag. 
    if (!wait) 
     flags |= LOCKFILE_FAIL_IMMEDIATELY; 

    m_isFileLocked = LockFileEx(m_fileDesc, flags, 0, (DWORD) m_mappingLength, (DWORD) (((uint64_t) m_mappingLength) >> 32), NULL); 
    return m_isFileLocked; 
} 

每當我到LockFileEx()呼叫我得到一個訪問衝突:

未處理的異常在0x7466c2ec在tftpServer.exe:0000005:
訪問衝突讀取位置0x00000008。

文件句柄m_fileDesc肯定是有效的句柄(文件到存儲器映射與該手柄工作)和m_mappingLength只是一個size_t含有以字節爲單位映射文件部分的長度。

有誰有一個想法如何解決這一問題?

+0

的*這*指針爲空。您在空FileMapping對象上調用此方法。 –

回答

4

你的最後一個參數是NULL,而應該是一個指向OVERLAPPED結構。有關讀取位置0x00000008的錯誤可能對應於以下文檔要求:

您必須將hEvent成員初始化爲有效句柄或零。

鑑於hEvent成員來自兩個指針後,在32位編譯它將從結構的開始8個字節。所以LockFileEx可能試圖讀取hEvent成員,並崩潰。

+0

哎呀,我一定忽略了。我現在創建了一個OVERLAPPED結構,並將其地址傳遞給LockFileEx(),它可以工作。感謝您的幫助。 – tommazzo

+0

我剛剛被同樣的疏忽咬傷。它應該在MSDN文檔中使用** bold **! :) – wilx

2

引用鏈接到該文檔:

lpOverlapped的[IN,OUT]

的指針,該函數與鎖定請求使用一個OVERLAPPED結構。該結構需要,包含鎖定範圍開始的文件偏移量。您必須將hEvent成員初始化爲有效句柄或零。

所以你最後一個參數是錯誤的。

+0

糟糕,我一定忽略了這一點。我現在創建了一個OVERLAPPED結構,並將其地址傳遞給LockFileEx(),它可以工作。感謝您的幫助。 如果size_t是32位,我知道第5個參數的問題。這就是爲什麼我首先將它轉換爲uint64_t,所以我有一個64位的值來執行轉換。我知道在32位平臺上這個參數應該總是爲零,但我希望它可以在32位和64位平臺上工作,這就是爲什麼我要參加演員陣容和轉換。 – tommazzo