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基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引號.双引號.三重(单 ...
随机推荐
- C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET
C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...
- 4.2、Libgdx每个模块概述
(原版的:http://www.libgdx.cn/topic/34/4-2-libgdx%E5%90%84%E4%B8%AA%E6%A8%A1%E5%9D%97%E6%A6%82%E8%A7%88) ...
- 使用Ajax以及Jquery.form异步上传图片
一.前言 之前做图片上传一直用的第三方插件,Uploadify 这个应该是用的比較多的,相同也用过别的,在方便了自己的同一时候也非常赞叹人家的功能. 思来想去,仅仅会用别的人东西,始终自己学到的少, ...
- 在MVC应用程序中动态加载PartialView
原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载.为了演示与做好这个 ...
- python 入门学习---模块导入三种方式及中文凝视
Python 有三种模块导入函数 1. 使用import 导入模块 import modname : 模块是指一个能够交互使用,或者从还有一Python 程序訪问的代码段.仅仅要导入了一个模块,就能够 ...
- 读懂Java中的Socket编程(转)
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- ActivityGroup简单介绍
ActivityGroup简单介绍 1.ActivityGroup的核心就是继承了该类,可以通过getLocalActivityManager()得到一个LocalActivityManager 如, ...
- CH BR4思考熊(恒等有理式-逆波兰表达式求值)
恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...
- Linux iptables简单配置
#!/bin/sh#modprobe ipt_MASQUERADEmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpiptables -Fiptables -t ...
- Java字节流和字符流
file.txt文本中存储的内容: 好abc 1.字符流处理: package com.wjy.java; import java.io.FileInputStream; import java.io ...