0

我已阅读了解 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 怎么办?

4

1 回答 1

1

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

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

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

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

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

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

于 2013-10-18T09:34:34.983 回答