我已阅读this并了解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呢?
答案 0 :(得分:1)
参数lpClass
应该是文件类型的progID。这是什么意思?
考虑一下如果你没有通过课程会发生什么。
实际上,这意味着Shell在.htm
下的注册表中查找文件扩展名(例如HKEY_CLASSES_ROOT\.htm
)。然后它检查默认值,通常为htmlfile
。 (它也使用其他技巧,但在绝大多数情况下,它是确定编程的扩展名。)
接下来查找HKEY_CLASSES_ROOT\htmlfile
,并使用其中的信息(HKEY_CLASSES_ROOT\htmlfile\shell\open
下)决定如何打开文件。
那么你如何使用lpClass
?好吧,例如,假设你有一个.TXT
文件,但是你知道它确实是html,你可以将"htmlfile"
作为lpclass
参数传递。这将跳过步骤1(查看文件扩展名以查找类)并直接进入步骤2.这将(通常)导致文件在浏览器中打开而不是记事本。
在您的示例中,您已将"bar.exe"
作为lpFile
参数传递。如果您将"txtfile"
作为lpClass
传递,则应该会发现它不是运行bar.exe
而是在记事本中打开它。