DCOM揭秘之三

DCOM例子,绝对可以用的。 安装和配置说明请参考我的BLOG文章: DCOM在局域网内安装配置说明 地址: http://hi.youkuaiyun.com/link.php?url=http://blog.youkuaiyun.com%2Flinhancai 立即下载
理解简单的DCOM服务器

  以上我们主要讲解了如何通过一个客户 应用 使用COM。对于客户来说,COM的编程技巧是相当简单的。客户端的应用向COM子系统请求一个特定的组件, 服务器 端将其传送过来。 

  实际上,对于后台的组件管理工作,还需要写很多的代码。真正的对象实现需要使用复杂的系统组件和标准的应用模块。就算是使用MFC,也是很复杂的。大多数的专业编程者都不会花时间来研究这个过程。自从COM的标准发布以来,很快就令我们明白到让开发者来自己写这些代码是不现实的。

  当你查看实现COM的真正代码时,你会发现其中大部分都是重复的。对于这类复杂的问题,传统 C ++的解决之道是创建一个COM类库。实际上,MPC OLE类提供了大部分的COM特性。

  不过对于COM组件来说,MFC和OLE并不是一个好的选择,有几个理由。随着ActiveX和 微软 Internet策略的推出,COM对象应该要非常的紧凑和快速。ActiveX需要COM对象可以经过网络相当快地被复制。如果你使用MFC较多,就会发现它实在太大了(特别是在静态链接时)。通过网络来传送巨大的MFC对象是不现实的。

  或许通过MFC/OLE方法来实现COM组件的最大问题是复杂性。OLE编程是复杂的,并且大部分的编程者都不会在上面走得很远。有大量关于OLE的书,这都说明它是非常难以掌握的。

  由于OLE的开发有不少的难度,因此微软创建了一个称为ATL(Active Template Library)新工具。对于COM编程来说,ATL是当前最实用的工具。实际上,如果你对其背后的东西没有兴趣,使用ATL向导来编写COM服务器是相当简单的。

  这里介绍的例子都是通过ATL和ATL应用向导来创建的。这一节我们将讲解如何建立一个基于ATL的服务器,并对向导产生的代码给出了一个摘要。


关于代码

  有一点你要花时间去习惯,编写ATL服务器和传统的编程是不一样的。COM服务器其实是几个独立组件的协作构成的,包括有:

   。你的应用

   。COM子系统

   。ATL模板类

   。“IDL”代码和MIDL产生的“C”头文件和程序

   。系统寄存器

  要将一个基于ATL的COM应用作为一个整体看是挺困难的。即使你知道它正在做什么,还有很大一块应用你是看不到的。真正服务器中的大部分逻辑都深入隐藏在ATL的头文件中。你将不会找到一个单一的用来管理和控制服务器的main()函数。你只找到一个用来调用基本ATL对象的瘦外壳。

  在以下的部分中,我们将把所有这些令服务器运作的部分放在一起。首先我们会使用ATL COM应用向导来创建服务器。第二步我们将加入一个COM对象和一个方法。我们将写一个进程内的服务器,因为它是最容易实现的COM服务器之一。一个进程内的服务器也不用建立一个proxy和stub对象。

  建立一个基于DLL(进程内)的COM服务器

  一个进程内的服务器就是一个会在运行时载入到你程序中的COM类。用其它话来说,就是一个动态链接库(DLL)中的COM对象。用传统的观点来看,一个DLL并不是一个真正的服务器,因为它会直接载入到客户的地址空间中。如果你熟悉DLL,你已经知道了许多关于COM对象如何载入和映射到调用程序的知识。

  通常在调用LoadLibrary()时,DLL就会被载入。在COM中,你无需显式调用LoadLibrary()。在客户端的程序调用CoCreateInstance()时,所有的处理都会自动启动。CoCreateInstance需要的其中一个参数是你要使用的COM类的GUID。当服务器在编译时创建时,它就会登记了所有它支持的COM对象。当客户端需要该对象时,COM找到服务器DLL,并且自动装载它。一旦载入,DLL就拥有了创建COM对象的类库。

  CoCreateInstance() 返回一个指向COM对象的指针,它是用来调用方法的(再这里的例子中,这个方法就是被称为Beep()的方法)。COM的一个便利之处是DLL可以在不需要的时候被自动卸载。在对象被释放和CoUninitialize()被调用后,FreeLibrary()将会被调用来卸载服务器DLL。

  如果你对以上的都不熟悉也不要紧。要使用COM,你不需要知道关于DLL的任何知识。你所要做的是调用CoCreateInstance()。COM的其中一个好处是它隐藏了这些细节,因此你无需担心此类问题。

  进程内的COM服务器有优点也有缺点。如果动态链接是你的系统设计中的重要一环,那么你将发现COM可提供一个极好的方式来管理DLL。一些有经验的编程者会将所有他们的DLL都写成为进程内的COM服务器。COM处理所有涉及载入、卸载的杂事,而输出DLL函数和COM函数调用只有很少的系统开销。

  我们选择一个进程内服务器的主要理由就更简单了:它可令例子更加简单。我们不必关心如何启动远程的服务器(EXE或者服务),因为我们的服务器将会在需要的时候自动载入。我们也无需建立一个proxy/stub DLL来做marshalling的工作。

  缺点是,由于进程内的服务器与我们的客户绑定很紧密,因此COM许多重要的“分布”特性没有展现出来。一个DLL服务器和它的客户共享内存,而一个分布的服务器将令客户端更加隔离开来。在一个分布的客户和服务器间传送数据的处理被称为marshaling。marshaling在COM上的利用是受到限制的,而在进程内的服务器中,我们无需关心这些。

使用ATL向导创建服务器

  为了让你理解COM的基本规则,我们将创建一个非常简单的COM服务器。该服务器只有一个方法--Beep()。这个方法只是发出Beep的声音--一个不是很有用的方法。我们将要做的是设置该服务器所有部分。一旦该体系设置完毕,要加入其它有用的方法就变得非常简单了。

  使用ATL AppWizard是一个可快速产生一个COM服务器的简单方法。该向导可让我们选择所有基本的选项,并且将产生我们需要的大部分代码。以下就是一个产生服务器的详细步骤。在这个程序中,我们将称该服务器为BeepServer。所有的COM服务器都至少要有一个接口,而我们的接口将会被称为IBeepObj。你可以为你的COM接口取任意的名字,不过如果你想遵循标准的命名传统,你最好使用“I”的前缀来命名它。

  注意:很多人在这时可能还会分不清COM“对象”、“类”和“接口”定义之间的区别。特别是对于C++的编程者,这些术语开始都不太令人舒服。不过,当你了解这些例子后,你的混淆就会减少。在大部分的微软文档中,COM类都用“coclass”来表示,以将COM类和普通的C++类区分开来。

  以下就是使用Visual C++ version 6来创建一个新的COM服务器的步骤(它与版本5中的几乎一样):

   1。首先,创建一个新的“ATL COM AppWizard”项目。由主菜单中选择File/New。

   2。在“New”的对话框中选择“Projects”标签页。在项目类型中选择“ATL COM AppWizard”。选择以下的选项并且按下OK。

   。项目的名字:BeepServer

   。创建新的Workspace

   。Location:你的工作目录



******************图一*******************

  3。在第一个的AppWizard对话框中我们将创建一个基于DLL(进程内)的服务器。输入以下的设置:

   。动态链接库

   。不允许合并proxy/stub代码

   。不支持MFC


*******************图二********************

  4。按下完成

  AppWizard创建一个基于DLL的COM服务器,并且带有所有必要的文件。虽然该服务器将可编译和运行,但它只是一个空壳。为了令它做我们想做的事情,我们将需要一个COM接口和支持该接口的类。我们也必须写接口中的方法。

  加入一个COM对象和一个方法

  现在我们继续COM对象的定义,包括接口和方法。类的名字是BeepObj,它拥有一个称为IBeepObj的接口:
   1。查看“Class View”的标签页。在开始的时候它的列表中仅有唯一一个项目。右击“BeepServer Classes”项

   2。选择“New ATL Object...”。这个步骤也可通过主菜单来完成。在弹出的菜单项中选择“New ATL Object”。


******************图三*******************

  3.在对象向导的对话框中选择“Objects”。选择“Simple Object”并且按Next。

 
**************图四*****************

  4。选择Names的标签页。输入对象的名字:BeepObj。其余所有的选择都会自动填入标准的名字


************图五*******************

  5。按下“Attributes”标签页并且选择Apartment Threading, Custom Interface, No Aggregation。很明显,在aggregation在这个服务器中并没有用到。


**************图六*****************

  6。按下OK,这将创建Com对象

为服务器加入一个方法

  我们现在已经创建了一个空的COM对象。不过,它还是一个无用的对象,因为它并不做任何的事情。我们将创建一个称为Beep()的简单方法,它可令系统发出一次beep声。我们的COM方法将调用Win32 API函数:Beep()。

  1。打开“Class View”标签。选择IBeepObj的接口。该接口有由一个类似匙的小图标代表


***************图七******************

  2。右击IBeepObj的接口。由菜单中选择“Add Method”。

  3。在“Add Method to Interface”对话框中,输入以下的信息并且按下OK。加入“Beep”的方法并且给它一个单一的[in]参数作为持续时间。这将是发beep音的长度,以毫秒计。


***************图八***********************

  4.“Add Method”已经创建了我们定义方法的MIDL定义。该定义以IDL编写,并且定义该方法到MIDL编译器。如果你想看IDL的代码,双击“Calss View”标签页中的“IBeepObj”接口。这将打开和显示BeepServer.IDL文件的内容。我们没有必要改变这个文件,我们的接口定义如下所示:

interface IBeepObj : IUnknown
{
 [helpstring("method Beep")] 
 HRESULT Beep([in] LONG duration);
};

  IDL的句法与 C ++类似。这一行和C++的函数原型相当。我们将在以后谈论IDL的句法。

  5。现在我们将要写该方法的C++代码。AppWizard已经为我们的C++函数写入一个空壳,并且将它加入到头文件的类定义中(BeepServer.H)。

  打开BeepObj.CPP的源文件。找到//TODO:行并且加入到API Beep函数的调用。修改Beep()方法为如下:

STDMETHODIMP CBeepObj::Beep(LONG duration)
{
// TODO: Add your implementation code here
::Beep( 550, duration );
return S_OK;
}

  6。保存文件,并且便宜该项目

  我们已经拥有一个完整的COM服务器了。当项目结束编译时,你应该会看到如下的信息:

---------Configuration: BeepServer - Win32 Debug------
Creating Type Library...
Microsoft (R) MIDL Compiler Version 5.01.0158 
Copyright (c) Microsoft Corp 1991-1997. All rights reserved.
Processing D:\UnderCOM\BeepServer\BeepServer.idl
BeepServer.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\oaidl.idl
oaidl.idl
.
.
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
BeepServer.cpp
BeepObj.cpp
Generating Code...
Linking...
Creating library Debug/BeepServer.lib and object Debug/BeepServer.exp
Performing registration

BeepServer.dll - 0 error(s), 0 warning(s)

  这意味着开发工具已经完成了以下的步骤:

   。执行MIDL编译器来产生代码和类库

   。编译源文件

   。链接项目来创建BeepServer.DLL

   。注册COM组件

   。使用RegSvr32注册DLL,以便在需要的时候自动下载

  看看我们产生的项目吧。在我们按下按钮的时候,AppWizard已经产生了文件。如果你观看“FileView”标签,可看到已经产生了以下的文件

  
源文件描述
BeepServer.dswProject workspace
BeepServer.dsp项目文件
BeepServer.plg项目的日志文件,包含了项目建立时的详细错误信息
BeepServer.cppDLL主程序,DLL输出的实现
BeepServer.hMIDL产生文件包含了接口的定义
BeepServer.def声明标准的DLL模块参数: DllCanUnloadNow, DllGetClassObject, DllUnregisterServer 
BeepServer.idlBeepServer.dll的IDL源。IDL文件定义了所有的COM组件
BeepServer.rc资源文件。这里主要的资源是IDR_BEEPDLLOBJ,它定义了注册表的脚本,用来将COM的信息载入到寄存器中。
Resource.h 微软Developer Studio产生的包含文件
StdAfx.cpp预编译头的源
Stdafx.h标准的头
BeepServer.tlb由MIDL产生的类库。该文件是COM接口和对象的二进制描述。作为连接一个客户的一个可选方法,TypeLib是非常有用的
BeepObj.cppCBeepObj的实现。该文件包含了所有真正的C++代码,用来实现COM BeepObj对象中的所有方法。
BeepObj.hBeepObj COM对象的定义
BeepObj.rgs注册表的脚本,用来在注册表中登记COM组件。在服务器工程被建立时,注册是自动进行的
BeepServer_i.c包含了IID和CLSID的真正定义,这个文件通常被包含在cpp代码中。
还有另外几个proxy/stub文件,由MIDL产生。

  只是几分钟,我们就创建了一个完整的COM服务器 应用 。在没有向导的日子里,写一个服务器将需要数个小时。向导的缺点是我们有了一大块没有完全弄懂的代码。在下面的部分我们将更为详细地查看产生的模块,然后是整个的应用。

   总结

  整个服务器的代码几乎都是完全由ATL向导产生的。我们使用的是一个基于DLL的服务器。不过这个过程对于所有的服务器类型几乎都是一样的。使用这个架构,我们可以很快的开发出一个服务器应用,因为你不需知道许多的细节就可以开始工作。

  在以下的章节中,我们将查看进程内服务器和ATL的代码。

【华为鸿蒙3.0/荣耀安卓12使用VMOS Pro的激活方式 方法二】 关于荣耀手机安卓12如何解除进程限制,这里提供以下教程供小伙伴们参考。 阅读详情

相关推荐

Hierarchical-Localization 环境配置与依赖管理全攻略

本文提供了Hierarchical-Localization(hloc)视觉定位工具箱从零开始的环境配置与依赖管理全攻略。针对Windows、Ubuntu和macOS三大操作系统,详细解析了Python版本选择、PyTorch与CUDA版本匹配、pycolmap版本锁定等核心依赖的安装步骤,并汇总了权重文件格式、NumPy版本、路径配置等常见问题的排查与解决方案,旨在帮助用户高效搭建稳定的hloc开发环境。

weixin_29066781的博客 335

DCOM(分布式组件对象模型)原理浅析(一)

(分布式组件对象模型)是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。DCOM基于组件对象模型(COM),COM提供了一套允许同一台计算机上的客户端和服务器之间进行通信的接口(运行在Windows95或者其后的版本上)。 DCOM(分布式组件对象模型,分布式组件对象模式)是一...

weixin_34342207的博客 451

从拆箱到跑通:Intel RealSense D435i开箱实测+ROS驱动配置全流程

本文详细记录了Intel RealSense D435i深度相机的开箱体验,并提供了在Ubuntu 22.04与ROS2 Humble环境下,从安装librealsense2 SDK到配置ROS2驱动的完整流程。重点解决了驱动安装、数据流发布、点云对齐以及IMU数据融合等关键步骤,帮助研究者和开发者快速实现D435i与机器人系统的集成。

weixin_29168393的博客 305

DCOM揭秘之二

理解简单的DCOM服务器   以上我们主要讲解了如何通过一个客户应用使用COM。对于客户来说,COM的编程技巧是相当简单的。客户端的应用向COM子系统请求一个特定的组件,服务器端将其传送过来。    实际上,对于后台的组件管理工作,还需要写很多的代码。真正的对象实现需要使用复杂的系统组件和标准的应用模块。就算是使用MFC,也是很复杂的。大多数的专业编程者都不会花时间来研究这个过程。自从

stypace的专栏 1648

给粒子物理萌新的Geant4保姆级入门:从看懂B1示例代码到跑通第一个模拟

本文为粒子物理初学者提供Geant4的保姆级入门指南,从解析B1示例代码到跑通第一个模拟。详细介绍了环境准备、代码解析、可视化系统实战及扩展模拟的方法,帮助新手快速掌握Geant4的基本概念和工具包使用。

weixin_29231725的博客 500

【对比学习+分割】CRIS:CLIP驱动RIS图像分割(CVPR 2022)

CRIS: CLIP-Driven Referring Image Segmentation

这个博客太懒了什么都没说 3325

DCOM揭秘

http://www.pcdog.com/p/html/2004927/27920042820_1.htm Distributed COM --跨网络工作  DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。   大多数的COM编程者仅使用本地的“进程内”

天道酬勤 6624

使用Label Studio标注车牌数据:YOLOv26模型训练指南

在计算机视觉领域,数据标注是模型训练的基础环节,直接影响最终模型的识别精度。Label Studio作为专业的标注工具,支持多种标注类型和格式导出,特别适合目标检测任务的数据准备。通过多边形标注技术,可以精确捕捉车牌的四个角点,生成旋转矩形框(OBB)标注数据,这种标注方式相比传统水平框能更好地处理倾斜车牌场景。标注完成后,数据可导出为YOLO格式,直接用于YOLOv26等先进目标检测模型的训练。在实际工程中,合理的标注策略和严格的质量控制能显著提升车牌识别模型在复杂场景下的鲁棒性,适用于智能交通、停车场管

chuozhi7142的博客 904

DCOM原理

1、DCOM       COM的进程透明特性表现在组件对象和客户程序即可以拥有各自的进程空间,也可以共享同一个进程空间,COM负责把客户的调用正确传到组件对象中,并保证参数传递的正确性。组件对象和客户代码不必考虑调用传递的细节,只要按照一般的函数调用的方式实现即可。如果进一步拓展进程透明特性,考虑组件对象与客户程序运行在不同计算机上的情形,把进程透明性拓展为位置透明性,形成分布式组件对象模型

frank_zu的专栏 3235

半导体设备系列(2) 半导体设备与工厂控制仿真器Demo编写

基于C/S架构用C++编写半导体设备仿真器与工厂控制仿真器

追赶时代的博客 610

第14.10章 高翔博士最新开源框架Lightning-LM源码解读(十):在线定位run_loc_online涉及到的核心模块总结

本文对Lightning-LM激光SLAM定位框架进行了全面剖析。该框架是一个轻量高效的激光雷达建图与定位系统,支持3D SLAM、动态图层管理等功能。文章首先介绍了项目概况和源码结构,包括核心模块如定位系统(loc_system)、激光匹配(lidar_loc)和位姿图优化(pose_graph)等。接着详细解析了各模块的关键函数和运行流程,如数据接收处理、NDT匹配和位姿优化等。最后总结了学习该框架所需的C++知识要点,包括智能指针、多线程编程等现代C++特性。该分析为SLAM开发者提供了实用的架构参考

行知SLAM 802

PCB_Project.PrjPcb 4 Not in version control

Altium Designer中PCB项目出现"NOT in version control"错误的解决方法:1. 禁用不需要的版本控制集成(DXP→Preferences→Version Control);2. 清理项目缓存(Projects面板右键→Clean Project);3. 检查文件读写权限;4. 如无效可新建项目重新添加文件。如需使用SVN版本控制,需正确配置SVN客户端路径,创建或连接SVN仓库,并将项目文件提交至版本控制系统。注意新建SVN仓库必须使用空目录,建议使用

whm128的博客 1599

DCOM 揭秘之三

Distributed COM --跨网络工作   DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。    大多数的COM编程者仅使用本地的“进程内”服务器,作为DLL运行。DLL载入到客户程序的处理空间,因此很可靠和有效。我们打算使用一

stypace的专栏 9652

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

DCOM揭秘之六

<br />   Distributed COM --跨网络工作<br /> <br /><br /><br />  DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。 <br /><br />  大多数的COM编程者仅使用本地的“进程内”服务器,作为DLL运行。DLL载入到客户程序的处理空间,因此很可靠和有效。我们打算使用一个基于EXE的服务器。这意味着服务器和客

谭杰凯的专栏 1110

DCOM 揭秘之四

<br />  我们已经讨论了DCOM的基本要点,了解了如何创建一个简单的DCOM服务器和一个相关的客户端。你也可以看到这个基本的过程是非常简单的---ATL向导处理了服务器端的大部分细节,要激活服务器,你只需要在客户端写10行左右的代码就可以了。<br /><br />  接下来我们将讨论两个相关的主题。首先是创建你自己的COM客户和服务器,结合第一部分我们所学到的,让你了解要在自己的代码中集成一个DCOM服务器,确实需要做哪些事情。然后我们将快速地看一下由ATL向导产生的代码。<br /><br /> 

谭杰凯的专栏 530

DCOM揭秘之一

传说中的COM,很难明,咬牙切齿……转载天极的一篇文章,说得稍微易懂点,但依然还是稀里糊涂,不懂……              COM的基本要素         首先要弄懂COM是怎样工作的。为什么这个工作是首要的呢?因为COM使用它自己专有的词汇。第二个原因是COM包含有不少的新概念。要掌握这些词汇和概念,最简单的其中一个方法是将COM对象和普通的C++对象作比较,并且比较它们

embededvc的专栏 1709

DCOM揭秘之五

<br />  理解ATL产生的代码<br /><br />  我们服务器端DLL的源代码是由ATL产生的。对于许多人来说,可以完全不用了解ATL创建的代码。不过,对于一些喜欢寻根究底的人来说,这是不可以接受的。这里就介绍一下由ATL产生的代码。<br /><br />  服务端的DLL代码由三种不同类型的文件组成<br /><br />   首先,是传统的C++源文件和头文件。在开始时,所有这些代码是由ATL向导产生的<br /><br />   Beep方法是通过使用“AddMethod”对话框加入的,

谭杰凯的专栏 744

DCOM揭秘之六——远程COM调用(服务器端和客户端)

DCOM揭秘之六 2001-08-23 09:27作者:QQ新人类出处:Yesky责任编辑:方舟    Distributed COM --跨网络工作   DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。

coolbear1027的专栏 9826
上一篇: DCOM揭秘之二
下一篇: DCOM 揭秘之四
embededvc
博客等级 码龄21年 176粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值