【问题标题】:Why can't the lnk icon show correctly?为什么 lnk 图标不能正确显示?
【发布时间】:2012-09-04 08:03:41
【问题描述】:


我尝试使用 IShellLink 和 IPersistFIle 接口创建新的快捷方式链接文件。 通过调用 IPersistFIle::save() 完成保存 lnk 文件后,我想在 save 函数返回后立即删除用于创建 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);

【问题讨论】:

    标签: c++ api shell com


    【解决方案1】:

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

    位置

    您删除了图标,该位置不再有效。

    样板是使用嵌入在可执行文件中的图标作为资源。但如果您使用单独的 .ico 文件,则需要保持其有效。

    【讨论】:

    • 嗨,汉斯,我用来创建 lnk 文件的图标是一个单独的 .ico 文件,而 IShellLink::SetIconLocation() 中的参数是该 ico 文件的位置。保存 lnk 文件几秒钟后,我尝试删除 ico 文件,但没有刷新图标缓存,ico 看起来是正确的,但是如果我通过 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, 0, 0) 刷新缓存,lnk文件再次显示在空白页中。所以我认为这可能与图标缓存有关。
    • 我以为我说得很清楚。 不要删除 .ico 文件
    • 我现在知道了,谢谢汉斯。但我对不同的结果很好奇。为什么我保留ico文件,IShellLink::Save和lnk文件后几秒后删除,链接文件看起来正确?
    • 图标缓存不是用来备份已删除图标的,它只是为了加速资源管理器。它不在你的控制之下,你不能指望任何特定的行为或保证。
    • 感谢您耐心的回答,汉斯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多