最原始的COM组件调用过程(不使用注册表信息)
最原始的COM组件调用过程(不使用注册表信息)
最近因为项目的关系开始研究COM组件了,以前都认为COM过时了,所以也没怎么接触. 现在好好补补课了.
一般调用COM都是通过注册表找到它的位置, 然后调用COM库的标准函数. 这些封装无疑使得我这个初学者无法了解里面到底做了什么, 而且注册表和COM库标准函数都是windows提供的, 但是COM这个思想是可以在Linux下实现的. 只要知道它的实现原理就行了. 因此我就试着用最基本的调用方法来使用COM组件, 以了解其调用过程和原理.
首先,我用vs的ATL创建了一个简单的ATL项目test, 然后添加了一个简单对象Mytest, 该对象实现了一个IMytest接口,该接口有一个testfunc函数. 编译生成了一堆自动产生的文件, 我们只需要最后的test.dll文件和test.h文件. 有了这两个文件,我们就可以使用该组件中实现的接口了.
然后,我创建了一个win32控制台项目来测试一下如何不使用注册表来调用COM组件中的接口方法. 不使用注册表,那么该test.DLL文件也就不需要使用regsvr32.exe来注册组件了,我们使用手动加载的方式来使用COM组件. (将test.dll放在win32程序运行目录下,将test.H文件放在win32工程目录下)
过程如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
// usetest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "test.h"//#import "test.dll"#include <iostream>using namespace std;typedef HRESULT ( __stdcall *CREATEFUNC)(REFCLSID clsid,REFIID iid,void** ppobj);int _tmain(int argc, _TCHAR* argv[]){HINSTANCE hi= ::LoadLibrary(L"test.dll");if(hi!=NULL){ cout<<"dll loaded."<<endl; CREATEFUNC CreateInstance = (CREATEFUNC)::GetProcAddress(hi,"DllGetClassObject"); if(CreateInstance!=NULL) { cout<<"get DllGetClassObject method - Success."<<endl; IClassFactory* pICF = NULL; HRESULT hr = CreateInstance(__uuidof(Mytest),IID_IClassFactory,(void**)&pICF); if(SUCCEEDED(hr)) { cout<<"create IClassFactory - Success."<<endl; IMytest* pIMytest=NULL; HRESULT hr2 = pICF->CreateInstance(NULL,__uuidof(IMytest),(void**)&pIMytest); if (SUCCEEDED(hr2)) { cout<<"get interface - Success."<<endl; HRESULT hr3=pIMytest->testfunc(1); if (SUCCEEDED(hr3)) { cout<<"Invoke interface method OK."<<endl; } pIMytest->Release(); } pICF->Release(); } } FreeLibrary(hi);}return 0;} |
和windows相关的只用到了dll加载相关的API,而这些在其他系统下都有对应的api. 所以如果想在其他系统下实现以下COM的调用, 还是可以的.
更进一步,可以使用xml文件来维护com组件的位置信息, 然后写一套与系统无关的通过xml文件查找com组件的库,这样就可以实现com组件的跨平台了.
哈哈,想法不错,实现起来还是有难度的.
最原始的COM组件调用过程(不使用注册表信息)的更多相关文章
- Excel催化剂开源第32波-VSTO开发的插件让WPS顺利调用的方法-注册表增加注册信息
VSTO插件开发完成后,鉴于现在WPS用户也不少,很多时候用户没办法用OFFICE软件,只能在WPS环境下办公,VSTO开发的插件,只需增加一句注册表信息,即可让WPS识别到并调用VSTO开发的功能, ...
- JS 通过注册表调用启动本地软件
(关键点:所有软件安装的注册表路径是不会变化的,这个注册表路径需沟通软件商家获取或者通过自己安装在注册表中查找得到) // 调用 注册表编辑类 方法 function run_jxpgj(){//进项 ...
- vue+element ui项目总结点(四)零散细节概念巩固如vue父组件调用子组件的方法、拷贝数据、数组置空问题 等
vue config下面的index.js配置host: '0.0.0.0',共享ip (假设你的电脑启动了这个服务我电脑一样可以启动)-------------------------------- ...
- 为operamasks增加HTML扩展方式的组件调用
#为operamasks增加HTML扩展方式的组件调用 ##背景 之前的[博文](http://www.cnblogs.com/p2227/p/3540858.html)中有提及到,发现easyui中 ...
- .net ADF 中 Ajax 的调用过程.
图示是 .net ADF Ajax调用过程的简略过程: 1,2)当页面初始化之后, 浏览器一旦触发回调事件, 脚本函数负责处理回调信息, 并调用 ASP.NET 2.0/3.5 中的 WebForm_ ...
- RPC原理及其调用过程
远程过程调用,简称为RPC,是一个计算机通信协议,它允许运行于一台计算机的程序调用另一台计算机的子程序,而无需额外地为这个交互作用编程. RPC与传统的HTTP对比 优点: 1. 传输效率高(二进制传 ...
- WebService—CXF整合Spring实现接口发布和调用过程
一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId> ...
- Mixins 改成使用高阶组件调用
把组件放在另外一个组件的 render 方法里面, 并且利用了 {...this.props} {...this.state} 这些 JSX 展开属性 对比下2种代码: 原始方式: <!DOC ...
- 可执行EXE在windows调用过程
举例图中, 一个C#编写的测试程序, 输出两句话分别 : Hello, GoodBye, 介绍其在windows上CLR的调用过程. 1.在执行Main方法之前, CLR会检测出Main的代码引用的所 ...
随机推荐
- slogan
nasa to infinity and beyond Werner Vogels at amazon all things distributed Kelly Johnson at Lockheed ...
- hdu 1116 Play on Words 欧拉路径+并查集
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- CSS笔记(十四)CSS3之动画
参考:http://www.w3school.com.cn/css3/css3_animation.asp 通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片.Flash 动画以及 Ja ...
- FLASH CC 2015 CANVAS 中 gotoAndStop、gotoAndPlay() 不起作用
哎 话不多说先看我的代码: //舞台上 放着sp0.sp1....sp8,9个mc,每个mc都有几帧, //帧上有如下代码 var S=this; S.stop() inIt1();//not wor ...
- 编写spring配置文件时,不能出现帮助信息
由于spring的schema文件位于网络上,如果机器不能连接到网络,那么在编写配置信息时候就无法出现提示信息,解决方法有两种: 1.让机器上网,eclipse会自动从网络上下载schema文件并缓存 ...
- asp.netMVC中,视图层和控制器层的传值
Asp.Net Mvc 控制器与视图的数据传递 摘要:本文将讨论asp.net mvc框架中的数据传递. 数据传递也就是控制器和视图之间的交互,比如在视图中提交的数据,在控制器怎么获取,或者控制器从业 ...
- Java抓取网页数据(原网页+Javascript返回数据)
有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同! 本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数 ...
- Python学习(9)列表
目录 Python 列表 访问列表中的值 更新列表 删除列表元素 列表脚本操作符 列表截取 列表函数&方法 Python 列表(List) 序列是Python中最基本的数据结构.序列中的每个元 ...
- JavaWeb学习总结(九)--JDBC入门
一.什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库 ...
- 【Android界面实现】FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别
转载请注明出处: http://blog.csdn.net/zhaokaiqiang1992 FragmentPagerAdapter是android-support-v4支持包里面出现的一个新的适配 ...