使用了 WTL 的 CHyperLink 在界面上显示 URL 链接。在 Vista 下运行正常,但是换到 XP SP2 系统发现网页无法打开。
CHyperLink 是用 ShellExecute(..., L"open", url, ...) 来打开链接的。调试发现是 ShellExecute 执行失败了,返回 5,也就是 ACCESS DENIED(ERROR_ACCESS_DENIED 或 SE_ERR_ACCESSDENIED)。
还好就是发现同样的控件,在另一个程序工作很正常。后来寻找各种原因,最后发现问题是在 CoInitializeEx 这里引起的。将进程初始化的 ::CoInitializeEx(NULL, COINIT_MULTITHREADED) 替换成 ::CoInitialize(NULL),则发现链接打开正常!
当然 WTL 生成的模板对这两者的解释是:
HRESULT hRes = ::CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call instead to
// make the EXE free threaded. This means that calls come in on a random RPC thread.
//HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
ATLASSERT(SUCCEEDED(hRes));
|
具体有什么鬼窍门也不知道,能工作就 OK 了。
阅读(4258) | 评论(1) | 转发(0) |