IShellLink - 如何获取原始目标路径

时间:2021-06-03 15:19:34

标签: windows winapi com

我在 Windows PC 中创建了一个 shortcut,目标路径为:

C:\Users\b\Desktop\New Text Document.txt

然后我将快捷方式复制到另一台具有不同用户名的PC,我想检索原始目标路径。

如果用文本编辑器打开快捷方式文件,可以看到保留了原来的路径,所以目标肯定是可以的。

以下代码不起作用,尽管存在 SLGP_RAWPATH。它输出:

C:\Users\a\Desktop\New Text Document.txt

它正在将用户文件夹名称更改为与正在运行的程序关联的名称。

我理解不是环境变量的问题,因为文件中看不到环境变量名。但我找不到关于这种自动重定位行为的任何文档。

IShellLinkW*lnk;
if (CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID*)&lnk) == 0){
    IPersistFile* file;
    if (lnk->QueryInterface(IID_IPersistFile, (void**)&file) == 0){
        if (file->Load(L"shortcut", 0) == 0){
            wchar_t path[MAX_PATH];
            if (lnk->GetPath(path, _countof(path), 0, SLGP_RAWPATH) == 0){
                _putws(path);
            }
            IShellLinkDataList* sdl;
            if (lnk->QueryInterface(IID_IShellLinkDataList, (void**)&sdl) == 0){
                EXP_SZ_LINK* lnkData;
                if (sdl->CopyDataBlock(EXP_SZ_LINK_SIG, (void**)&lnkData) == 0){
                    _putws(lnkData->swzTarget);
                    LocalFree(lnkData);
                }
                sdl->Release();
            }
        }
        file->Release();
    }
    lnk->Release();
}

2 个答案:

答案 0 :(得分:2)

Windows Shell Link 类实现了一个 property store,因此您可以使用这样的代码(使用 ATL 智能指针)访问它:

System.ItemNameDisplay: New Text Document.txt
System.DateCreated: 2021/06/03:14:45:30.000
System.Size: 0
System.ItemTypeText: Text Document
System.DateModified: 2021/06/03:14:45:29.777
System.ParsingPath: C:\Users\b\Desktop\New Text Document.txt
System.VolumeId: {E506CEB2-0000-0000-0000-300300000000}
System.ItemFolderPathDisplay: C:\Users\b\Desktop

它会输出这个:

...   
ps->GetValue(PKEY_ParsingPath, &pv); // propkey.h
...   

所以,您正在寻找 System.ParsingPath,您可以像这样直接获得:

{{1}}

答案 1 :(得分:0)

您的快捷方式是一个 .lnk 文件,只是没有 .lnk 文件扩展名。根据 Microsoft 的最新 "Shell Link (.LNK) Binary File Format" documentation,您的快捷方式似乎被配置为 相对 文件目标。相对名称只是 New Text Document.txt。我没有深入研究该文件,但我猜测它与系统的 Desktop 文件夹相关,因此它将采用当前 PC 的实际 Desktop 文件夹。这可以解释为什么在更改 PC 时查询目标会将相对根从 C:\Users\b\Desktop 更改为 C:\Users\a\Desktop

至于能够查询原始目标C:\Users\b\Desktop\New Text Document.txt,我不知道。它也存在于文件中,所以在理论上应该有一种查询它的方法,但我不知道它在哪个字段中,没有花时间完全解码这个文件。您应该尝试使用上述文档编写自己的解码器。

相关问题