程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> c++-調用IPersistFile::Save後,如何等待保存完成?

c++-調用IPersistFile::Save後,如何等待保存完成?

編輯:編程解疑
調用IPersistFile::Save後,如何等待保存完成?

C++調用COM組件創建快捷方式。
創建完成後,馬上要把創建好的.lnk文件復制到另一個位置,結果失敗。
但是在創建完成後Sleep一段時間,就成功了。
推測是IPersistFile還沒來得及寫入文件。
我應該如何得知文件已經保存完成?

大致代碼如下:

bool create_succ = false;

CoInitialize(NULL);
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLinkA, (void**)&pShellLink);
if (SUCCEEDED(hres))
{
    pShellLink->SetPath(target_path);
    IPersistFile *pPersistFile;
    hres = pShellLink->QueryInterface(IID_IPersistFile, (void**)&pPersistFile);
    if (SUCCEEDED(hres))
    {
        hres = pPersistFile->Save(link_file, TRUE);
        if (SUCCEEDED(hres))
        {
            create_succ = true;
        }
        pPersistFile->Release();
    }
    pShellLink->Release();
}
CoUninitialize();

//  Sleep(1000);    //  加上這句就能成功

if (create_succ)
{
    CopyFile(link_file, dest);
}

之前沒怎麼用過COM,望知道的指點一下,多謝~

最佳回答:


已解決。最後證明不是COM和IPersistFile的問題。

剛剛創建的小於4KB(簇大小)的文件,立即使用會產生問題。不光是IPersistFile::Save(),就連CopyFile、CreateFile創建的文件,如果小於4KB,也有這個問題。需要補全才能用。另外,如果在可移動磁盤內創建小文件不補全,驅動器又在短時間內請求彈出的話,還會彈出失敗。

補全流程:
1. 讀取IPersistFile創建的lnk文件至內存。
2. 如果大小小於4KB,在後面用空白數據填充至4KB。
3. 新建一個文件,把填充後的lnk文件內容全部寫入,關閉。

在原文件後面附加數據補全不行,必須新建文件!

Windows這種緩存文件的行為,MSDN裡面好像也沒說過,反正我沒看到。這裡真想吐槽一下。。。微軟的東西坑實在是太多了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved