关于 ShellExecute 返回 SE_ERR_ACCESSDENIED 的问题
今天在调用 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