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裡面好像也沒說過,反正我沒看到。這裡真想吐槽一下。。。微軟的東西坑實在是太多了。