IShellLink GetArguments只返回可执行文件

IShellLink GetArguments is only returning executable

本文关键字:可执行文件 返回 GetArguments IShellLink      更新时间:2023-10-16

我有一个包装程序,需要识别所有已发布的XP模式应用程序;这些都驻留在一个文件夹中,我使用Qt来获取所有的。link文件。

这个位有效-问题是,所有的虚拟PC应用程序都使用rundll32来启动虚拟机和/或其应用程序(例如%SystemRoot%system32rundll32.exe %SystemRoot%system32VMCPropertyHandler.dll,LaunchVMSal "Windows XP Mode" "||some_id" "some_name"),因此我需要读取完整的目标。

阅读MSDN文档,IShellLink上的GetArguments()应该返回此数据-但它只检索到rundll32.exe的路径,并且从不带任何末尾的命令行数据。GetPath()做了同样的事情,正如预期的那样,但是我没有看到其他方法可以调用,可能能够获得我需要的数据。

我创建了一个具有不同参数样式(/param, -param和普通param)的测试快捷方式,但没有什么区别。这不仅仅是虚拟PC链接有问题——这适用于所有快捷方式。

函数代码如下:

QString GetShortcutTarget(const char* shortcut)
{
    IShellLink* psl = NULL;
    IPersistFile*   ppf = NULL;
    wchar_t     wsz[MAX_PATH];
    wchar_t     target[MAX_PATH * 4]; // w/e
    QString     retval;
    if ( MultiByteToWideChar(CP_ACP, 0, shortcut, -1, wsz, MAX_PATH) == 0 )
        goto cleanup;
    if ( FAILED(CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER,    IID_IShellLink, (void **)&psl)) )
        goto cleanup;
    if ( FAILED(psl->QueryInterface(IID_IPersistFile, (void **)&ppf)) )
        goto cleanup;
    if ( FAILED(ppf->Load(wsz, STGM_READ)) )
        goto cleanup;
    // GetPath() and GetArguments return the same
    //if ( NOERROR != psl->GetPath(target, _countof(target), nullptr, 0) )
    if ( NOERROR != psl->GetArguments(target, _countof(target)) )
        goto cleanup;
    retval = QString::fromWCharArray(target);
cleanup:
    if ( ppf )
        ppf->Release();
    if ( psl )
        psl->Release();
    return retval;
}

编辑

不在任何地方重新定义接口,包括和链接:

#include <objidl.h> // IPersistFile
#include <shlobj.h> // IShellLink
#pragma comment ( lib, "ole32.lib" )
#pragma comment ( lib, "uuid.lib" )

只有其他与COM相关的代码在别处的构造函数和析构函数中(是的,已经被调用了!):

CoInitialize(NULL);
...
CoUninitialize();

Qt希望不应该与它有任何关系,因为COM肯定是打开和读取。link .

我发现了问题-输入快捷方式是. link,而不是绝对文件路径;由于我的当前目录没有设置为快捷方式所在的目录,这自然会导致加载失败。

我有Qt在绝对路径上迭代,但我只是在搜索目标时传递文件名。我在其他地方修改了我之前的呼叫:

file_info.fileName()

:

file_info.absoluteFilePath()

,这已经解决了这个问题!