0

0

javascript的COM对象是什么

青灯夜游

青灯夜游

发布时间:2022-10-14 17:24:41

|

3140人浏览过

|

来源于php中文网

原创

COM对象是指“组件对象模型对象”,是一个使用COM规格的可以重复使用的软件组件;使用COM规格可以确保COM对象很好的工作,并且很容易的结合到你的应用程序中。COM对象一般用动态连接库(DLL)实现;和普通的DLL一样,COM对象暴露一些方法,用户的应用程序能够呼叫它,以便完成任何支持的操作。

javascript的COM对象是什么

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

什么是COM对象?

组件对象模型(COM)对象是一个使用COM规格的可以重复使用的软件组件。使用COM规格可以确保COM对象很好的工作,并且很容易的结合到你的应用程序中。事实上,COM基本相当于一个黑匣子,这个黑匣子能为你的应用程序完成很多的工作。

COM对象一般用动态连接库(DLL)实现。和普通的DLL一样,COM对象暴露一些方法,你的应用程序能够呼叫它,以便完成任何支持的操作。应用程序与COM对象的相互作用有点儿像应用程序与C++对象之间的相互作用,但他们之间又有一些明显的不同。 

立即学习Java免费学习笔记(深入)”;

  • COM对象实施了精确的封装。你不能简单的创建一个对象和任意呼叫它的公共方法。一个COM对象的公共方法被放入一个或更多的接口组中。对于方法的使用,你必须创建一个COM对象,并且从这个COM对象中获得这个COM对象的一个适当的接口。例如: IDirect3DCubeTexture8接口中包含一个使你能够处理立方体构架资源的方法。不属于这个接口的任何方法都是不能够访问的。

  • COM对象的创建不同与C++对象的创建。有几种方法可以创建COM对象,但都涉及到了COM-specific 技术。微软的DirectX应用程序接口(API)包含了用于创建大多数DirectX对象的各种各样的帮助函数和方法。

  • 你必须用COM_specific 技术控制COM对象的寿命。

  • COM对象不需要被显示的调入。COM对象被包含在一个DLL中。然而,在你使用这个COM对象的时候,不需要显示的调入DLL或着显示调入静态接库。每一个COM对象有一个用来创建这个对象的唯一的注册ID.  COM会自动的调入正确的DLL.

  • COM是二进制规格的。COM对象可以从各种的各样的语言写入和访问。你不需要知道关于COM对象源码的任何事情。例如:Microsofe Visual Bisice 应用程序日常用COM对象写入C++ .

对象和接口

   明白对象和接口之间的区别是很重要的。偶然的用法是, 有的时候一个对象的名字被引用为主要接口的名字。然而,严格的说,这两个条件是不能互换的。

  •    ▲一个COM对象能够暴露任意数量的接口。例如:所有的COM对象必须暴露IUnknown接口,它们一般至少暴露一个附加的接口,也可能更多。为了使用这些特殊的方法,你不仅要创建COM对象,而且还要获取正确的接口指针。

  •    ▲很多的对象可能暴露相同的接口。一个接口是一组能够执行指定操作的方法。接口的定义规定了方法的语法和他们功能。支持特殊操作的任何一个COM对象都暴露了一个适当的接口。有一些接口是高度专门化的,并且它们只被一个单一的对象暴露。其他多数情况下是被多个对象暴露的。一个很特殊的情况的是IUnknown接口必须被每一个COM对象暴露。

   附注:假如一个对象暴露一个接口,它必须在接口中定义每一个支持的方法。换句话说,你能够呼叫的任何方法都要确信它是存在的。然而,从一个对象到另一个对象,方法实现的细节是能够改变的。例如:不同的对象可能用不同的算法得到最后的结果。有时候,一个对象暴露一个旧的接口,仅仅需要支持方法的子集。你仍然能够成功的呼叫余下的其它方法,但是,他们将返回E_NOTIMPL。

   COM标准要求一个接口一旦发行,它的定义便不能再改变。你不能再这个已经存在的接口中添加新的方法。你必须重新创建一个新的接口。通常一般的做法是在下一代接口中包含旧接口的所有方法,然后再添加上任何新的方法。

   一个接口有几代这是很常见的。通常,他们的实质是一样的, 但是他们的细节不同。通常,一个对象能够暴露每一代的接口。这样做允许较老的程序继续使用对象的较老的接口,同样新的程序也能发挥新接口的特性。通常,接口家族有相同的名字,在名字的后面加上用于标示第几代的整数。例如:假如原始接口的名字为IMyInterface, 那么下两代的接口被命名为IMyInterface2和IMyInterface3。整数标示一般用directx的版本号。

GUIDS

  全局唯一标示符(GUIDS)是COM程序模式的一个关键的部分。最基本的原则,GUIDS是一个128位的结构。然而,GUIDS的创建方式能够保证任何的两个GUIDS都是不相同的。COM广泛的使用GUIDS有两个主要的目的:

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载

     1、为了唯一标示一个特定的COM对象。
     2、为了唯一标示一个特定的COM接口。

返回值(HRESULT)

  所有的COM方法返回一个名叫HRESULT的32位值。对于大多数方法,HRESULT 实际上是一个包含了两部分信息的结构。

     1、这个方法是否成功或失败。
     2、输出关于方法支持的操作的详细信息。

  一些方法返回的HRESULT的值是在Winerror.h中进了定义的。方法返回的HRESULT值也可以是用户专门的一些信息。这些值通常会在方法的参考页中被验证。

    事实上,COM对象的方法调用能够返回各种各样的表示调用成功或失败的代码,这意味着你必须要很小心的测试其返回值。例如:假如一个方法调用的返回值是
S_OK,这表明这个方法调用成功,如果返回值时S_FAIL,表明调用失败,当然,方法调用也可能返回其他的标识调用成功或者失败的代码。下面的代码段举例说明对代码进行这样的简单的测试是不安全的。代码中hr的值时该方法调用的返回值:

    if( hr == E_FAIL )
     {
        //Handle the failure
     }
     else
     {
        //Handle the success
     }

如果这段代码只返回E_FAIL,这个代码段能够很好的工作。然而,事实不是这样,这个方法调用还有可能返回其他的值,例如:E_NOTIMPL, E_INVALIDARG.如果代码返回这些值,这个代码段没有对其进行处理,默认会标识程序执行正常,然而实际程序是出现错误的。

如果你想知道关于方法调用的更详细的信息,你必须测试每一个相关的返回值。然而,你也许只想知道这个方法调用是否成功。有一种很好的方法可以让你测试方法调用是否成功,就是把方法的返回值传递给下面的两个宏,他们在winerror.h文件中定义。

    1、宏SUCCEEDED 返回TRUE表明调用成功,返回FALSE表明调用失败。
    2、宏FAILED 返回TRUE 表明调用失败,返回FALSE表明调用成功。

你可以用FAILED宏来修改一下前面的代码段。

    if( FAILED(hr) )
    { 
       //Handle the failure.
    }
    else
    {
       //Handle the success.
    }

上面的代码段对E_NOTIMPL 和 E_INVALIDARG的错误进行了处理。

虽然大部分的方法的返回值HRESULT是一个结构值,但有少数的方法的返回值HRESULT是一个简单的整数值。这就隐含着返回整数值的这些方法总是能够调用成功。假如你将这种类型的返回值传递给SUCCESS宏,这个宏将总是返回TRUE。一个常见的例子是:IUnkoown::Release 方法。这个方法的作用是释放(减少)一个对象的使用计数,并返回对象的当前使用计数。使用计数用来标识对象的存在寿命。

指针的地址

   假如你看到过一些COM方法的参考页面,你可能遇到过像下面的这样的一些情况:

   HRESULT CreateDevice(
      . 
      .
      .
      IDirect3DDevice8 **ppReturnedDeviceInterface
      )

    通常,任何一个c 或者c ++开发者对指针都很熟悉,COM通常用一个附加的间接标准。这个标准是:在两个星号(**)后面紧跟着类型说明和带有典型"pp"前缀的变量的名字来标识。在前面的例子中,ppReturnedDeviceInterface参数是一个指向IDirect3DDevice8接口的指针的地址。
  
    和c++不一样,你不能直接访问COM对象的方法,取而代之的是,你必须获得一个能够暴露方法的一个接口的指针。调用对象接口的方法的语法和用指针调用c++方法的语法是一样的。例如:调用IMyTnterface::DoSomething 的方法,你只需使用下面的语法就行了。

   IMyInterfance *pMyTface;
   .
   .
   .
   pMyIface->DoSomething(...) ;

   对于COM对象接口的指针来说,你不能直接创建一个指向接口的指针。你必须呼叫一个或多个其他的方法来得到这个指针。例如:前面提到的CreateDevice方法。

通过这个方法得到接口的指针,你需要声明一个变量,用来指向你所请求的接口。把这个变量的地址传递给CreateDevice方法,换句话说,你必须给这个方法传递一个变量的地址。当这个方法返回的时候,这个变量将指向你所请求的接口,并且你能够通过这个指针来访问这个接口的其方法。

更多编程相关知识,请访问:编程视频!!

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号