WEB开发网
开发学院软件开发VC 用键盘操作静态链接打开应用程序中的URLs 阅读

用键盘操作静态链接打开应用程序中的URLs

 2006-07-23 11:20:37 来源:WEB开发网   
核心提示: 你是众多遇上这等不幸怪事的人之一,没错,用键盘操作静态链接打开应用程序中的URLs(6),只要你设置 /clr 开关来使用托管扩展,那么当你尝试用 ShellExecute 打开 Web 页面时会失败,ShellExecute 在所有多线程环境下都无法正常工作,所以,我也曾经一度被它绊倒,

你是众多遇上这等不幸怪事的人之一。没错,只要你设置 /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 呢?有一个静态重载正好是你想要的:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:键盘 操作 静态

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接