你目前正处于脱机状态,正在等待 Internet 重新连接

信息: 从一个多线程单元中调用 Shell 函数和接口

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 287087
概要
当您使用一个作为一个多线程单元而完成初始化的线程调用或访问一个 shell 函数或 shell 接口时,这个函数或者接口的功能会受到损坏或完全失败。
更多信息
对 CoInitializeEx(COINIT_MULTITHREADED) 的调用允许对在调用线程上创建的对象调用,以在任何线程上运行。当访问对象使用单元线程模型与多线程单元,COM 将同步对对象的访问。为了使这种同步发生,COM 必须对该对象调用封送。外壳程序当前不提供必要的信息,因为通过类型库或代理/存根 (stub) 代码,其对象,以进行封送处理,尝试访问 shell 对象从多线程的单元失效。

以下是如何对 CoInitializeEx(COINIT_MULTITHREADED) 的调用可能会影响依赖 shell 对象的函数的示例:

GetOpenFileName/GetSaveFileName
用户可以导航到命名空间扩展文件夹,例如"我的文档"通过打开另存为对话框。但是,这些文件夹不能浏览到因为浏览器不能创建所需的接口,如 IShellFolder。
ShellExecute/ShellExecuteEx
通过实现 IShellExecuteHook 接口扩展的 ShellExecute/ShellExecuteEx 的功能,可以编写 ShellExecute 挂钩。当调用 ShellExecute/ShellExecuteEx 时,不能加载注册的 ShellExecute 挂钩。
在这两个示例中,尝试获取具有 CoCreateInstance,IUnknown::QueryInterface,shell 对象的接口指针等等的组件通常失败,出现错误 E_NOINTERFACE 从多线程单元中调用时。这是因为,如上所述,是没有任何类型信息或代理/存根 (stub) 代码所请求的对象。
参考
"进程,线程和单元,在 COM 基础平台 SDK 文档中:

警告:本文已自动翻译

属性

文章 ID:287087 - 上次审阅时间:01/25/2015 10:51:00 - 修订版本: 2.0

  • kbinfo kbpending kbshellgrp kbmt KB287087 KbMtzh
反馈