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. 浅谈Jquery的使用上篇

    一. 1.Jquery是什么?有什么特性? jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取.HTML 元素操作. CSS 操作 .HTML 事 ...

  2. Android - JNI静态(static)载入OpenCV

    JNI静态(static)载入OpenCV 本文地址: http://blog.csdn.net/caroline_wendy 步骤: 1. 准备OpenCV-Android库 复制OpenCV的sd ...

  3. JavaScript 中的内存和性能、模拟事件(读书笔记思维导图)

    由于事件处理程序可以为现代 Web 应用程序提供交互能力,因此许多开发人员会不分青红皂白地向页面中添加大量的处理程序.在 JavaScript 中,添加到页面上的事件处理程序数量将直接关系到页面的整体 ...

  4. hdu 1063 Exponentiation 大数

    Problem Description Problems involving the computation of exact values of very large magnitude and p ...

  5. Android登陆界面实现-支持输入框清楚和震动效果功能

    演示效果 主要代码例如以下 自己定义的一个EditText.用于实现有文字的时候显示能够清楚的button: import android.content.Context; import androi ...

  6. 深入浅出Windows BATCH

    1.什么是Windows BATCH BATCH也就是批处理文件,有时简称为BAT,是Windows平台上的一种可运行脚本,与*nix(Linux和Unix)上的Shell脚本和其它的脚本(Perl, ...

  7. hdu4521(线段树+dp)

    传送门:小明系列问题——小明序列 题意:有n个数,求间距大于d的最长上升序列. 分析:dp[i]表示在i点以a[i]结束距离大于d的最长上升序列,然后每更新到第i点时,取i-d之前小于a[i]的数为结 ...

  8. nyoj 130 同样的雪花 【哈希】

    同样的雪花 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 You may have heard that no two snowflakes are alike. ...

  9. Java的byte数组

    今天我们讨论一下Java的byte数组.byte数组就是字节数组,每一位存一个字节.看下面程序,猜猜输出多少? package com.wjy.bytes; import java.io.File; ...

  10. SocketAsyncEventArgs使用解说

    原文:SocketAsyncEventArgs使用解说 如果在.NET下写过网络通讯的同学应该感觉不陌生了,有很多刚入门的同学很多都认为这东西可以大大提高处理效能还有就是使用上很不适应.其实使用之前最 ...