Windows 使用ShellExecuteEx打开可执行文件,同时指定lpClass?
我已经阅读并理解lpClass可用于修复“错误的文件扩展名问题”。但是,当我阅读下面几行代码时,我无法理解在打开可执行文件时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 =
//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。这是什么意思
好好想想如果你不及格会发生什么。
HKEY\u CLASSES\u ROOT\.htm
下查找文件扩展名(例如.htm
)。然后检查默认值,该值通常为htmlfile
。(它还使用其他技巧,但在绝大多数情况下,是扩展决定了progid)HKEY\u CLASSES\u ROOT\htmlfile
,并使用那里的信息(在HKEY\u CLASSES\u ROOT\htmlfile\shell\open
下)来决定如何打开文件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系统将负责启动它。