首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ShellExecuteEx导轨

ShellExecuteEx导轨
EN

Stack Overflow用户
提问于 2017-07-27 17:47:18
回答 1查看 354关注 0票数 2

我有一条形式的道路

代码语言:javascript
复制
::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Fonts

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

如何使用ShellExecuteEx或类似的方法(包含guids的路径)执行相同的操作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-27 18:45:45

要打开这样的GUID路径,必须将shell:协议添加到路径中:

代码语言:javascript
复制
shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Fonts

请注意,GUID路径通常在Windows 之间更改,例如,上面的路径在我的Windows 10机器上不起作用。

更好的方法是使用已知文件夹API获取指向文件夹的PIDL,并使用ShellExecuteEx打开该PIDL。

代码语言:javascript
复制
#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调用后立即退出。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45357708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档