为什么lnk图标无法正确显示?

时间:2012-09-04 08:03:41

标签: c++ api shell com


我尝试使用IShellLink和IPersistFIle接口创建一个新的快捷方式链接文件。 通过调用IPersistFIle :: save()完成保存lnk文件之后,我想在保存函数返回后立即删除用于创建lnk的ico文件。但问题是lnk文件显示在空白页面中,而不是我使用的图标。
如果我在保存后没有调用deletefile(),那么lnk文件看起来是正确的。
我的问题是保存lnk文件后何时可以删除图标文件?
PS:我试着睡觉,就像删除文件前2秒一样,lnk看起来也是正确的。
我的部分代码如下:

    hRes = pShellLink->QueryInterface(IID_IPersistFile,(LPVOID*)&pPerFile);

    if (SUCCEEDED(hRes))
    {
        WCHAR wszLinkFile[MAX_PATH + 1] = {0};
    #ifdef _UNICODE
        StringCchCopy(wszLinkFile, sizeof(wszLinkFile) / sizeof(wszLinkFile[0]), lpszLinkFilePath);
    #else
        MultiByteToWideChar(CP_ACP, 0, lpszLinkFilePath, -1, wszLinkFile, MAX_PATH);
    #endif

        hRes = pPerFile->Save(wszLinkFile, TRUE);
        pPerFile->Release();
    }
    pShellLink->Release(); 

    ::CoUninitialize();

    DeleteFile(lpszIconPath);

1 个答案:

答案 0 :(得分:2)

您没有发布足够的代码,但方法名称是IShellLink :: SetIconLocation()。

  

位置

您删除该图标并且该位置不再有效。

Boilerplate是使用嵌入在可执行文件中的图标作为资源。但是如果你使用单独的.ico文件,那么你需要保持它有效。