ShellExecuteEx在64位调用隐藏文件时静默失败

时间:2015-06-25 12:43:55

标签: windows winapi

我有一个只想打开文件的64位控制台应用程序。设置了文件的隐藏属性(文件被隐藏)。以下代码仅在某些机器上失败。 ShellExecuteEx实际上会返回TRUE,但.txt文件无法在记事本中打开,并且hProcess结构的SHELLEXECUTEINFO成员在通话后仍为零。

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hWnd = GetConsoleWindow();
sei.lpVerb = _T("open");
sei.nShow = SW_SHOWNORMAL;
sei.lpFile = _T("C:\\some\\existing\\file.txt");

BOOL bRC = ShellExecuteEx(&sei);

MessageBox(GetConsoleWindow(), sei.lpFile, sei.lpVerb, MB_OK);

致电MessageBox只是为了让ShellExecuteEx有足够的时间来发挥其魔力。如果满足以下条件中的至少一个条件,则.txt文件将在记事本中打开:

  • .txt文件未隐藏
  • 调用进程是32位,而不是64位
  • 该机器是其他的(无法弄清楚机器之间有什么区别,但文件在至少一个Vista和一个Windows 8.1中没有打开)
  • lpVerbnullptr"openas""properties"(当然只显示文件的属性),而不是"open",{ {1}},甚至是"edit"(对于.exe而不是.txt)

这里发生了什么? Windows资源管理器正确打开隐藏文件,因为它使用空动词,但我必须使用动词(" runas"实际上,但请不要被此信息分心)。它应该与" open"同样。我做错了什么?

1 个答案:

答案 0 :(得分:0)

原来问题出在一个Explorer扩展中。具有讽刺意味的是(但不出所料)这是我们自己的延伸。如果未注册扩展名,问题就会消失,.Where("has(store.{param})") .WithParam("param",region) 将再次适用于所有动词。