使用ShellExecuteEx打开可执行文件,还指定了lpClass?

时间:2013-10-18 09:18:38

标签: windows visual-c++ shellexecute

我已阅读this并了解lpC​​lass可用于修复“错误的文件扩展名问题”。但是,当我阅读以下代码行时,我无法弄清楚在打开可执行文件时使用的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呢?

1 个答案:

答案 0 :(得分:1)

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

考虑一下如果你没有通过课程会发生什么。

  1. 实际上,这意味着Shell在.htm下的注册表中查找文件扩展名(例如HKEY_CLASSES_ROOT\.htm)。然后它检查默认值,通常为htmlfile。 (它也使用其他技巧,但在绝大多数情况下,它是确定编程的扩展名。)

  2. 接下来查找HKEY_CLASSES_ROOT\htmlfile,并使用其中的信息(HKEY_CLASSES_ROOT\htmlfile\shell\open下)决定如何打开文件。

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

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