COM模块三---根的形成和注册代理server(Building and Registering a Proxy DLL)
Prerequisite:C++ 程序员,熟windows计划,熟Win32 Dll,了解windows注册表。
笔者:割者
上一篇文章中,我们定义了COM接口。通过编译生成了四个文件,本文使用这四个文件生成proxy/stub DLL.因为COM接口能够跨线程单元,跨进程。跨网络进行使用,因此,我们要解决一个參数数据传递的问题。
proxy/stub DLL就是为了完毕这个任务,当然。使用类型库也能够完毕,这里不做讨论。这里主要是将通过proxy/stub DLL的方式。在COM中。这个过程成为接口的marshal,我自己翻译的是接口的编列。
这里对于原理不做深入的讨论,要深入研究的同学,能够參考msdn中,COM和RPC(远程过程调用)两个部分的知识进行学习.
首先简介一下这四个文件。在使用MIDL编译IDL文件的时候,假设我们没有对MIDL的參数做什么改动,那么生成的四个文件的命名是以下这种U_p.c,U.h,U_i.c。dlldata.c。
当中U是一个占位符,它的实际名字依据你建立IDL文件的名称来设置的。比如,假设你的IDL文件的名称为shougezhe。那么U就是shougezhe了。这四个文件有不同的作用。首先U_p.c文件是一个c文件,里面包括了实现接口编列的代码。U.h是一个头文件。里面包括了接口和方法等信息的声明。
U_i.c文件是一个c文件,里面包括了接口,组件类的GUID的定义。
在声明接口和组件类的时候,属性里面我们定义了接口或是组件类的GUID。在编译IDL文件的时候,生成的U_i.h文件里就包括了接口与GUID的相应关系。dlldata.c文件是一个c文件,主要用来输出四个函数,后面将会介绍。
如今我们就要用这四个文件生成代理根(proxy/stub)server。
前面我们在建立解决方式的时候,使用空的解决方式,以及空的Win32 DLL项目,之所以这样,就由于在这里,我们仅仅须要一个空的Win32 DLL,至于DLL的入口函数。在dlldata.c文件里已经有了,我们不用管。
如今我就加入这四个文件到这个空的Win32 DLL中。在解决方式视图中。我们在空Win32 DLL项目名称上点击右键。弹出快捷菜单。选择“加入”,选择“现有项”。注意不是“现有项目”.例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluemhpeW91bml6aGl5b3VuaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
点击加入。就能够将这四个文件加入到我们先前建立的项目中.例如以下图:
在点击“生成”生成DLL之前。我们还要进行几个设置,首先是定义一个宏REGISTER_PROXY_DLL。它能够是dlldata.c输出DllMain, DllRegisterServer, and DllUnregisterServer 函数,我们在COMSampleWin32 DLL项目的名称上点击右键,选择“属性”,选择“C/C++”下的“预处理定义”,做例如以下图所看到的设置:
完毕之后点击确定,接着,我们在设置“链接器”下,选择“输入”项,设置“附加依耐项”,加入rpcns4.lib rpcrt4.lib uuid.lib,例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluemhpeW91bml6aGl5b3VuaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
设置完毕之后,点击确定,然后在COMSample名称上点击右键,弹出快捷菜单。选择“加入”,选择“新建项”。注意不是“新建项目”.在弹出来的窗体中。选择def(模块定义文件).例如以下图:
填入名称之后。点击加入。
这个文件用来输出四个函数,也就是上面提到的四个函数,例如以下图:
如今,我们点击“生成”.
如今已经生成成功了。接着。我们将这个DLL注冊。
使用Regsvr32.exe程序,这个程序的原理就是利用我们输出的DllRegisterServer函数实现了DLL的注冊,注冊的内容主要是例如以下所看到的的注冊表项目:
我们能够手动的注冊。也就是自己编写一个注冊函数输出,调用这个输出函数注冊DLL。
DllUnregisterSever函数主要是在卸载DLL在注冊表中的注冊,就是从注冊表中清除注冊信息。也是使用Regsvr32.exe,当加入了/u开关之后。就是卸载掉这个DLL的注冊。对于另外两个函数,能够參考msdn了解。
如今我们来注冊一下:
回车,我们看见,注冊成功了,例如以下图:
如今我们就完毕了编写COM的第二步,代理/根server的注冊。下一篇文章,我们就来实现我们定义的COM接口。
作者:收割者
本文假设在除了CSDN和推荐地址(磐实(panshy))之外的站点出现,均为非法盗用。
本文推荐地址:http://www.panshy.com/article/Sort_Desktop/other/2014-04-21/2487.php
COM模块三---根的形成和注册代理server(Building and Registering a Proxy DLL)的更多相关文章
- Nginx 全模块安装及匹配方式、反向代理和负载均衡配置
一.安装 OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超 ...
- 第三篇——第二部分——第一文 SQL Server镜像简介
原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什 ...
- 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...
- DAY20 常用模块(三)
一.加密模块 1.加密方式: 1.有解密的加密方式 2.无解密的加密方式,碰撞检查 1.不同数据加密后的结果一定不一致 2.相同数据的加密结果一定是一致 2.hashlib模块 1.基本使用 ciph ...
- MyBatis源码解析(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...
- C#软件授权、注册、加密、解密模块源码解析并制作注册机生成license
最近做了一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理. ...
- Python常用模块(三)
一.shelve模块 shelve也是一种序列化方式,在python中shelve模块提供了基本的存储操作,shelve中的open函数在调用的事和返回一个shelf对象,通过该对象可以存储内容,即像 ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
- [Python学习] 模块三.基本字符串
于Python最重要的数据类型包含字符串.名单.元组和字典.本文重点介绍Python基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引號.双引號.三重(单 ...
随机推荐
- 14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置
14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置 locking read, 一个UPDATE,或 ...
- A Game of Thrones(19) - Jon
The courtyard rang to the song of swords. Under black wool, boiled leather, and mail, sweat trickled ...
- BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 521 Solved: 159 [ Subm ...
- C语言中的system函数參数具体解释
http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功 能: 发出一个DOS命令 用 法: int sy ...
- 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播
已经上传到CSDN,下载地址:http://download.csdn.net/detail/avsuper/7421647,不要钱滴,嘿嘿... 本程序能够把摄像头视频和麦克风音频,录制为FLV文件 ...
- PowerDesigner中SQL文件、数据库表反向生成PDM
1 反向生成PDM 1) 创建一个空的PDM模型(选择相应的DBMS): 2) 选择[Database]--[Update Model from Database ...
- Wix学习整理(1)——快速入门HelloWorld
原文:Wix学习整理(1)--快速入门HelloWorld 1 Wix简介 Wix是Windows Installer XML的简称,其通过类XML文件格式来指定了用于创建Windows Instal ...
- NGUI使用教程(3) 使用外部图片制作Atlas(图集)
在实际操作之前有几个概念先弄清一下 Atlas:图集,把美术给你提供的素材,用 NGUI 的 Atlas Maker 工具.合成一张图片(准确的说,还同一时候生成了prefab.mat ). Spri ...
- RequireJS和JQuery的模块化编程
基于RequireJS和JQuery的模块化编程 由于js的代码逻辑越来越重,一个js文件可能会有上千行,十分不利于开发与维护.最近正在把逻辑很重的js拆分成模块,在一顿纠结是使用requirejs还 ...
- zTree实现地市县三级级联Service接口測试
zTree实现地市县三级级联Service接口測试 ProvinceServiceTest.java: /** * @Title:ProvinceServiceTest.java * @Package ...