添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

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

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

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