用键盘操作静态链接打开应用程序中的URLs
2006-07-23 11:20:37 来源:WEB开发网你是众多遇上这等不幸怪事的人之一。没错,只要你设置 /clr 开关来使用托管扩展,那么当你尝试用 ShellExecute 打开 Web 页面时会失败。我也曾经一度被它绊倒。托管扩展和 /clr 对 ShellExecute 做了些什么手脚呢?为什么会产生存取违例?
Windows 中常发生这种事情,错误代码提供的信息很难确定到底发生了什么。但通过搜索 MSDN 库,有一篇名为“Calling Shell Functions and Interfaces from a Multithreaded Apartment”的文章揭示问题的答案。很多年前,ShellExecute 就谦卑地开始了其一生;其功能无非是让你运行一个程序,也就是一个 EXE 文件。随着 Windows 变得越来越复杂,ShellExecute 也成长为几乎可以“执行”任何程序——例如一个磁盘文件(用关联程序打开文件),FTP 协议或者 Web 页面——只要将文件名或URL传递给它即可。它是通过外壳扩展和 IShellExecuteHook 实现的,IShellExecuteHook 是一个 COM 接口,这个接口通过告诉它如何“执行”传递到 ShellExecute(Ex) 的串来扩展外壳。例如,有一个 HTTP 协议扩展钩,它处理以“http://”开始的串。扩展处理例程启动默认的浏览器打开给定的 URL。
问题是用 /clr 和托管扩展强制你的应用程序进入多线程模式,因为垃圾收集器拟在单独的线程中异步运行。但是按照 INFO 文章的解释,许多 IShellExecuteHook 扩展之所以在多线程环境不工作,是因为它们没有所需的用于 COM 封送参数的代理/存根(proxy/stub)以及进行同步存取的代码。如果你对此感到困惑,那么很多人和你一样。但我只想说,ShellExecute 在所有多线程环境下都无法正常工作。
所以,如果你已经使用托管扩展,为什么不用.NET框架的Process类和 Process::Start 来代替 ShellExecute 呢?有一个静态重载正好是你想要的:
- ››键盘样式风格有关设置
- ››静态照片完美合成 美图秀秀幻影动感效果
- ››操作系统资源不足两种方案解决办法
- ››操作DHTML表格的C++对象
- ››操作微软文档的JAVA api项目:Apache POI 3.6发布...
- ››操作系统拾遗之进程和线程
- ››键盘流必备 - Windows 7常用快捷键整理之基础篇
- ››键盘流必备 - Windows 7常用快捷键整理之WIN键篇
- ››键盘流必备 - Windows 7常用快捷键整理之任务栏篇...
- ››键盘流必备 - Windows 7常用快捷键整理之资源管理...
- ››键盘极客 - 使用组合键来关闭Windows 7
- ››操作系统还原:你需要明白的几件事
更多精彩
赞助商链接