我有一条形式的路径
::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Fonts
如果我将其输入到资源管理器地址栏中,它会正确打开控制面板 - 字体。
如何使用 ShellExecuteEx 或类似的东西(包含 guid 的路径)执行相同的操作?
要打开此类 GUID 路径,您必须在前面添加shell:
路径协议:
shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Fonts
请注意,GUID 路径通常Windows 版本之间的更改,例如上述路径在我的 Windows 10 计算机上不起作用。
更好的方法是使用已知文件夹API https://msdn.microsoft.com/en-us/library/windows/desktop/bb776911(v=vs.85).aspx获取指向该文件夹的 PIDL 并使用以下命令打开该 PIDLShellExecuteEx
:
#include <iostream>
#include <windows.h>
#include <shellapi.h>
#include <atlbase.h> // CComHeapPtr
struct CComInit
{
HRESULT hr = E_FAIL;
CComInit() { hr = ::CoInitialize(nullptr); }
~CComInit() { if( SUCCEEDED(hr) ) ::CoUninitialize(); }
};
int main()
{
CComInit com;
if( FAILED( com.hr ) )
{
std::cout << "Failed to initialize COM, error: 0x" << std::hex << com.hr << '\n';
return static_cast<int>( com.hr );
}
CComHeapPtr<ITEMIDLIST> pidl;
HRESULT hr = ::SHGetKnownFolderIDList( FOLDERID_Fonts, KF_FLAG_DEFAULT, nullptr, &pidl );
if( FAILED( hr ) )
{
std::cout << "SHGetKnownFolderIDList failed with error 0x" << std::hex << hr << '\n';
return static_cast<int>( hr );
}
SHELLEXECUTEINFOW si{ sizeof(si) };
si.fMask = SEE_MASK_NOASYNC | SEE_MASK_IDLIST;
si.nShow = SW_SHOWDEFAULT;
si.lpVerb = L"open";
si.lpIDList = pidl;
if( !::ShellExecuteExW( &si ) )
{
DWORD err = ::GetLastError();
std::cout << "ShellExecuteExW failed with error " << err << '\n';
return static_cast<int>( err );
}
return 0;
}
Notes:
- ATL类
CComHeapPtr
是一个智能指针,会自动调用CoTaskMemFree()
在其析构函数中正确地释放由 shell 分配的 PIDL。如果你不想使用它,你必须打电话CoTaskMemFree()
手动或使用您自己的 RAII 包装器来执行此操作。
- 旗帜
SEE_MASK_NOASYNC
使用该示例是因为该示例是一个控制台程序,该程序将在执行后立即退出ShellExecuteEx
call.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)