gpt4 book ai didi

c++ - ShellExecuteEx 引导路径

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:38 31 4
gpt4 key购买 nike

我有一个表单的路径

::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Fonts

如果我在资源管理器地址栏中输入它,它会正确打开控制面板 - 字体。

如何使用 ShellExecuteEx 或类似的东西(包含 guid 的路径)执行相同的操作?

最佳答案

要打开这样的 GUID 路径,您必须在路径前添加 shell: 协议(protocol):

shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Fonts

请注意,GUID 路径通常在 Windows 版本之间发生变化,例如,上述路径在我的 Windows 10 机器上不起作用。

更好的方法是使用 known folder API 获取指向该文件夹的 PIDL 并使用 ShellExecuteEx 打开该 PIDL:

#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;
}

注意事项:

  • ATL 类 CComHeapPtr 是一个智能指针,它会在其析构函数中自动调用 CoTaskMemFree() 以正确释放由 shell 分配的 PIDL。如果您不想使用它,则必须手动调用 CoTaskMemFree() 或使用您自己的 RAII 包装器来执行此操作。
  • 使用标志 SEE_MASK_NOASYNC 是因为该示例是一个控制台程序,它将在 ShellExecuteEx 调用后立即退出。

关于c++ - ShellExecuteEx 引导路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45357708/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com