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基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引號.双引號.三重(单 ...
随机推荐
- 冒泡排序 JAVA版
冒泡排序 算法思想是每次从数组末端开始比较相邻俩元素,把第i小的冒泡到数组的第i个位置.i从0一直到N-1从而完成排序.当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到第N-i个位置.I从0 ...
- LLVM每日谈21 一些编译器和LLVM/Clang代码
作者:闪亮宁(snsn1984) 一些自己的收藏LLVM/Clang代码,而他自己写一些一点点LLVM/Clang译器的代码.在这里把这些代码库分享出来,欢迎大家交流探讨. 1.crange http ...
- Android中特殊图形的生成样例
import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...
- NET实现的DDD、CQRS与微服务架构
WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例 最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间 ...
- 项目中那些事|ListView中嵌套ListView问题
要在一个ListView中放入另一个ListView,也即在一个ListView的每个 item 中放入另外一个ListView.但刚开始的时候,会发现放入的子ListView会显示不完全(我这里只显 ...
- 怎样将android studio项目导入eclipse
如今,越来越多的开源项目都是用android studio来开发的,所以源码都与eclipse有所不同. 以下是将android studio项目导入eclipse的一般步骤: 1. 先解压项目: 2 ...
- AE+SceneControl源代码共享
近来的,博友发私信或邮件交换,第一次使用前SceneControl代做一点project股票,做的很粗糙.我们希望对大家有帮助,欢迎留言交流哈萨克斯坦. 除了主开.保存.数据加载.询价,几个功能主要是 ...
- 使用windows-SQLyog连接linux-mysql
嘿嘿,最近又清闲了一点,重新安装了mysql去学习. -----博客园-邦邦酱好 系统环境: 1. 主机为windows系统,安装了SQLyog. 2. 主机上还安装了虚拟机,系统为c ...
- vmware无法链接U盘:vm-->removeable devices.
vmware无法链接U盘:vm-->removeable devices.
- java-IO操作性能对照
在软件系统中.IO速度比内存速度慢,IO读写在非常多情况下会是系统的瓶颈. 在java标准IO操作中,InputStream和OutputStream提供基于流的IO操作.以字节为处理单位:Reade ...