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)的更多相关文章

  1. Nginx 全模块安装及匹配方式、反向代理和负载均衡配置

    一.安装 OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超 ...

  2. 第三篇——第二部分——第一文 SQL Server镜像简介

    原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什 ...

  3. 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...

  4. DAY20 常用模块(三)

    一.加密模块 1.加密方式: 1.有解密的加密方式 2.无解密的加密方式,碰撞检查 1.不同数据加密后的结果一定不一致 2.相同数据的加密结果一定是一致 2.hashlib模块 1.基本使用 ciph ...

  5. MyBatis源码解析(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...

  6. C#软件授权、注册、加密、解密模块源码解析并制作注册机生成license

    最近做了一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理.        ...

  7. Python常用模块(三)

    一.shelve模块 shelve也是一种序列化方式,在python中shelve模块提供了基本的存储操作,shelve中的open函数在调用的事和返回一个shelf对象,通过该对象可以存储内容,即像 ...

  8. springcloud(第三篇)springcloud eureka 服务注册与发现 *****

    http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...

  9. [Python学习] 模块三.基本字符串

            于Python最重要的数据类型包含字符串.名单.元组和字典.本文重点介绍Python基础知识. 一.字符串基础         字符串指一有序的字符序列集合,用单引號.双引號.三重(单 ...

随机推荐

  1. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  2. java中super()和this()浅析

    <span style="font-size:18px;">本质:这两个都是调用构造方法的方法.</span> 在java中,super()是在当前类的构造 ...

  3. Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi

    Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3.4.5和WebApi(跨平台) 1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和 ...

  4. Hibernate学习之createSQLQuery与createQuery的区别及使用

    hibernate中createQuery与createSQLQuery:前者用的hql语句进行查询,后者可以用sql语句查询,前者以hibernate生成的Bean为对象装入list返回,后者则是以 ...

  5. C语言里为何会有“2+2=5”的结果

    写这篇原创文章是由于看到了极客中的一篇文章<有趣各种编程语言实现2+2=5>,当中C语言是这样实现的: int main() { char __func_version__[] = &qu ...

  6. 杭州电ACM1098——Ignatius&#39;s puzzle

    这个话题.简单的数学. 对于函数,f(x)=5*x^13+13*x^5+k*a*x,输入k,对于休闲x,一个数字的存在a,使f(x)是65可分. 对于休闲x. 因此,当x = 1时间,f(x) = 1 ...

  7. xml(3)--dom4j实现crud操作

    1.XML解析技术概述 (1)XML解析方式分为两种:dom和sax     dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种标准方 ...

  8. Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...

  9. dede时间格试,dede时间标签

    dede的日期时间格式[field:pubdate function='strftime("时间",@me'/]这个是固定格式,(利用strftime()函数格式化时间),因些只需 ...

  10. 模拟Post

    string d = "http://search.anccnet.com/searchResult2.aspx"; //name="__VIEWSTATE" ...