Windows 使用ShellExecuteEx打开可执行文件,同时指定lpClass?

Windows 使用ShellExecuteEx打开可执行文件,同时指定lpClass?,windows,visual-c++,shellexecute,Windows,Visual C++,Shellexecute,我已经阅读并理解lpClass可用于修复“错误的文件扩展名问题”。但是,当我阅读下面几行代码时,我无法理解在打开可执行文件时lpClass的用途 //code excerpt from foo.exe SHELLEXECUTEINFO info; ZeroMemory(&info, sizeof(SHELLEXECUTEINFO)); info.cbSize = sizeof(SHELLEXECUTEINFO); info.nShow = SW_NORMAL; info.lpVerb =

我已经阅读并理解lpClass可用于修复“错误的文件扩展名问题”。但是,当我阅读下面几行代码时,我无法理解在打开可执行文件时lpClass的用途

//code excerpt from foo.exe
SHELLEXECUTEINFO info;
ZeroMemory(&info, sizeof(SHELLEXECUTEINFO));
info.cbSize = sizeof(SHELLEXECUTEINFO);
info.nShow = SW_NORMAL;
info.lpVerb = L"open";
info.lpClass = L"ProgId Of foo.exe"; //what is this used for???
info.fMask = SEE_MASK_FLAG_LOG_USAGE | SEE_MASK_CLASSNAME;    
info.lpFile = L"bar.exe";
info.lpParameters = lpszParam;
ShellExecuteEx(&info);

在未指定lpClass的情况下,如果lpVerb为“open”且lpFile为exe,则运行代码只执行exe。但是,如果在本例中指定了lpClass,该怎么办

参数
lpClass
应该是文件类型的progID。这是什么意思

好好想想如果你不及格会发生什么。
  • 实际上,这意味着Shell在注册表中的
    HKEY\u CLASSES\u ROOT\.htm
    下查找文件扩展名(例如
    .htm
    )。然后检查默认值,该值通常为
    htmlfile
    。(它还使用其他技巧,但在绝大多数情况下,是扩展决定了progid)

  • 接下来,它会查找
    HKEY\u CLASSES\u ROOT\htmlfile
    ,并使用那里的信息(在
    HKEY\u CLASSES\u ROOT\htmlfile\shell\open
    下)来决定如何打开文件

  • 那么,如何使用lpClass
    lpClass
    ?例如,假设您有一个
    .TXT
    文件,但您知道它实际上是html,您可以将
    “htmlfile”
    作为
    lpclass
    参数传递。这将跳过步骤1(查看文件扩展名以查找类),直接转到步骤2。这(通常)会导致在浏览器中而不是在记事本中打开文件


    在您的示例中,您已将
    “bar.exe”
    作为
    lpFile
    参数传递。如果您将
    “txtfile”
    作为
    lpClass
    传递,您应该会发现它不是运行
    bar.exe
    ,而是在记事本中打开它

    ProgId不用于文件关联。Foo.exe使用该ProgId注册为COM服务器,该ProgId用于调用bar.exe作为SHELLEXECUTEINFO中的lpClass成员…我对COM几乎没有经验,很抱歉,我无法充分解释ProgId与调用方Foo.exe的关系。@kennyzx,这不是
    ShellExecuteEx
    的目的。您需要
    CLSIDFromProgID
    CoCreateInstance
    。如果“bar.exe”注册正确,COM系统将负责启动它。