关于 ShellExecute 返回 SE_ERR_ACCESSDENIED 的问题

陪她去流浪 桃子 2016年04月11日 阅读次数:3073

今天在调用 ShellExecute 打开一个快捷方式文件 "C:\Users\Tao\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Bash on Ubuntu on Windows.lnk" 时,使用了如下的调用方式:

::ShellExecute(::GetActiveWindow(), "open", <上面的快捷方式>, nullptr, nullptr, SW_SHOWNORMAL);

ShellExecute 始终返回 SE_ERR_ACCESSDENIED(5) 拒绝访问的错误,我以为是权限问题,但并不是。于是尝试在网上搜索答案,几乎所有的答案都与 COMSTAMTA 环境有关,说要先调用 CoInitializeEx(COINIT_MULTITHREADED) 什么的都没卵用。反正我是不知道我的程序当前是什么环境, 也不知道怎么处理好,于是简单地通过下面的代码转交给 explorer 来处理,成功地解决了问题:

::ShellExecute(nullptr, "open", "explorer", <上面的快捷方式>, nullptr, SW_SHOWNORMAL);

到底该怎么处理,至今仍不知道,我已经花了两个小时在此问题上,有点不值得,如果阅读此文章的你已经知道了该怎么更好地解决此问题,请记得要告诉我。

无论怎样,以下文章可能对你有帮助:

  1. Opening URL with ShellExecute returns SE_ERR_ACCESSDENIED on Windows XP - Google Groups
  2. INFO: Calling Shell Functions and Interfaces from a Multithreaded Apartment
  3. User interface code + multi-threaded apartment = death | The Old New Thing
  4. Why does ShellExecute return SE_ERR_ACCESSDENIED for nearly everything? | The Old New Thing
  5. ShellExecute function(Windows)
  6. 日了 ShellExecute 了,总是返回 SE_ERR_ACCESS_DENIED · movsb/taoexec@1717f3b
  7. .net - Could you explain STA and MTA? - Stack Overflow

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:WinAPI