IShellLink :: SetIconLocation将我的图标路径转换为%Program Files%,这是错误的

Mor*_*hai 5 c++ windows-shell

有谁知道如何纠正这种行为?

当前,当我们的安装程序安装我们的应用程序时,它将获取IShellLink,然后使用快捷方式图标(在开始菜单和桌面中)所需的数据将其加载,然后使用IPersistFile :: Save编写快捷方式。

问题是通过IShellLink :: SetIconLocation为图标指定的路径使用%ProgramFiles%...(对于x64 ...)被转换为WRONG。

我注意到很多其他32位软件在x64下都无法通过此操作-但后来我假定他们自己在自己的.lnk创建代码中使用%ProgamFiles%作为文字元素。但是,似乎是IShellLink强迫该错误存在,并且我没有解决方法(或者说Shell中的链接属性编辑器对此问题负责,并且基础链接可以)。

一些Google搜索没有发现任何问题……是否有人遇到过这个问题,或者是否知道一篇文章/示例,说明如何强制x64 Windows不要对此进行处理?

澄清的例子:

hr = m_shell_link->SetIconLocation("C:\\Program Files (x86)\\Acme\\Prog.exe", 0);
Run Code Online (Sandbox Code Playgroud)

将产生一个带有正确图标的快捷方式,但是当您在快捷方式属性页中按“更改图标”时,将报告“ Windows找不到文件%ProgramFiles%\ Acme \ Prog.exe”。

小智 3

将名称转换为短文件名,它只会转换驱动器号,但保留正确的路径。

        PWCHAR pIcon = L"C:\\Program Files (x86)\\Myfoo\\Bar.exe";
        DWORD dwLen = GetShortPathName(pIcon, NULL, 0);
        PWCHAR pShort = NULL; 
        if (dwLen) {
            pShort = new WCHAR[dwLen];
            dwLen = GetShortPathName(pIcon, pShort, dwLen);
            if (!dwLen) {
                delete [] pShort;
                pShort = NULL;
            }
        }

        if (NULL == pShort) {
            psl->SetIconLocation(pIcon,iTmp);
        } else {
            psl->SetIconLocation(pShort,iTmp);
        }
        delete [] pShort;
Run Code Online (Sandbox Code Playgroud)

  • 可以接受。我真的宁愿让微软的人修复他们的错误。或者更好的是,回到过去,扇那些决定 32 位软件应该重命名其程序文件的混蛋,而不是强迫新的 x64 使用新路径。 (2认同)