IShellLink GetArguments只返回可执行文件
IShellLink GetArguments is only returning executable
我有一个包装程序,需要识别所有已发布的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()
,这已经解决了这个问题!
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 编译的C可执行文件被Windows defender检测为病毒
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何在可执行文件中存储常量数组?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 可执行文件C++包括.obj,.lib和.dll吗?
- 无法在 Linux 上运行C++ ZMQ 项目的可执行文件
- IShellLink GetArguments只返回可执行文件