2013-11-22 66 views
0

當程序從遠程目錄運行時,我的程序會凍結下一個字符串。WriteFIle凍結

::WriteFile(dst, ::LockResource(resource_data), resource_size, &written_size, NULL); 

所有參數都是正確的,輸出文件位於%TEMP%。 它看起來像安全策略拒絕寫入文件,但系統不顯示任何關於此的通知。

如果程序從本地目錄運行,相同的代碼工作良好。

我在MSDN上找不到關於這種情況的信息。

UPD:SSCCE。

bool ExtractResourceTo(const std::wstring& filename) { 
    CHandle file(::CreateFile(filename.c_str(), GENERIC_WRITE, 0, 0, 
          CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
    if (INVALID_HANDLE_VALUE == file) { 
    LOG("Cannot create file."); 
    return false; 
    } 
    const HINSTANCE instance = _AtlBaseModule.GetModuleINstance(); 
    HRSRC resource = ::FindResource(instance, kResourceName, 
            RT_RCDATA); 
    if (resource) { 
    HGLOBAL resource_data = ::LoadResource(instance, resource); 
    DWORD resource_size = ::SizeofResource(instance, resource); 
    if (resource_data && resource_size > 0) { 
     DWORD written_size; 
     LPVOID resource_ptr = ::LockResource(resource_data); 
     if (!resource_ptr) { 
     LOG("Cannot lock resource."); 
     return false; 
     } 
     ::WriteFile(file, resource_ptr, resource_size, 
        &written_size, NULL); 
     if (written_size == resource_size) { 
     return true; 
     } 
     LOG("Write failed."); 
    } 
    } 
    return false; 
} 
+0

'resource_data'是一個有效的'HGLOBAL'? LockResource的返回值是什麼? 'dst'是一個有效的'HANDLE'?爲了改進答案,您可能需要提供一個暴露此問題的[SSCCE](http://sscce.org)。 – IInspectable

+0

是的,'resource_data','dst'和'LockResource()'的返回值是有效的。我會在一兩個小時內提供一個SSCCE。 –

+0

這不是一個SSCCE。它不會編譯。我們無法運行它。我們仍然不知道'dst'是什麼。如果你從不使用它,看起來你創建一個文件的意義不大。我們沒有證據證明'LockResource'成功。 –

回答

0

看來,這是windows的「優化」。系統啓動進程並不立即加載資源。當WriteFile試圖訪問資源時,系統暫停線程並將給定的資源讀入內存,但可執行文件在遠程計算機上,並且資源的下載需要很長時間,因爲我的資源接近180MiB。

感謝大家,誰試圖解決我的問題。

+0

這就是所謂的按需分頁,它是所有現代操作系統的標準配置。 –