编写一个简单的COM组件
参考网站:编写一个简单的COM组件_a ray of sunshine-CSDN博客
(1) 用MIDL编写.idl文件
//将以下代码保存成 IXIYIZ.idl 文件
//在命令行上进行编译,编译命令:
//midl IXIYIZ.idl
//生成 IXIYIZ.h ,dlldata.c, IXIYIZ.h, IXIYIZ_p.c
//其中 IXIYIZ.h,IXIYIZ.h 文件是我们目前所需要的
import "unknwn.idl";
[
object,
uuid(7F67119B-1E09-4d4f-B472-2106CCAE3275)
]
interface IX: IUnknown
{
[local]
void __stdcall Fx();
};
[
object,
uuid(A667947B-714A-4bde-B2DD-C090928D62FF)
]
interface IY: IUnknown
{
[local]
void __stdcall Fy();
};
[
object,
uuid(AA80F229-0809-4c69-B8AA-BB6F58DBC304)
]
interface IZ: IUnknown
{
[local]
void __stdcall Fz();
};
(2) 编写组件类的头文件
// 将以下代码保存成 CA.h
// 注意将(1)中生成的 IXIYIZ.h 头文件包含进来
#include<iostream>
#include"IXIYIZ.h"
using namespace std;
class CA : public IX, public IY
{
HRESULT __stdcall QueryInterface(const IID& iid, void ** ppv);
ULONG __stdcall AddRef(){return 0;}
ULONG __stdcall Release(){return 0;}
void __stdcall Fx(){cout<<"Fx"<<endl;}
void __stdcall Fy(){cout<<"Fy"<<endl;}
};
extern "C" __declspec(dllexport) IUnknown* __cdecl CreateInstance();
(3) 编写组件类的实现文件
//将以下代码保存成 CA.cpp
//3.1编译 IXIYIZ_i.c,编译命令:
//cl /c IXIYIZ_i.c 生成 IXIYIZ_i.obj 文件
//3.2编译 CA.h 文件,编译命令:
//cl /c /GX CA.cpp 生成 CA.obj 文件
//3.3链接上面两个文件,生成组件DLL,编译命令:
//link /dll CA.obj IXIYIZ_i.obj 生成 CA.lib 和 CA.dll
//3.4将 IXIYIZ_i.obj 整合到 CA.lib 文件中,命令:
// lib CA.lib IXIYIZ_i.obj
#include"CA.h"
HRESULT __stdcall CA::QueryInterface(const IID& iid, void ** ppv)
{
if(iid == IID_IUnknown)
{
cout<<"QueryInterface:Return pointer to IUnknown."<<endl;
*ppv = static_cast<IX *>(this);
}
else if(iid == IID_IX)
{
cout<<"QueryInterface:Return pointer to IX."<<endl;
*ppv = static_cast<IX *>(this);
}
else if(iid == IID_IY)
{
cout<<"QueryInterface:Return pointer to IY."<<endl;
*ppv = static_cast<IY *>(this);
}
else
{
cout<<"QueryInterface:Interface not supported."<<endl;
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
extern "C" __declspec(dllexport) IUnknown* __cdecl CreateInstance()
{
IUnknown *pI = static_cast<IX*>(new CA);
pI->AddRef();
return pI;
}
(4) 编写客户端,对(3)生成的组件(CA.dll)进行测试
//将以下代码保存成 client.cpp 文件
//4.1编译客户端,编译命令:
//cl /c /GX client.cpp 生成 client.obj 文件
//4.2链接客户端与组件,命令:
//link client.obj CA.lib
#include<iostream>
#include<unknwn.h>
#include"IXIYIZ.h"
using namespace std;
extern "C" __declspec(dllexport) IUnknown* __cdecl CreateInstance();
int main()
{
HRESULT hr;
cout<<"Client: Get an IUnknown pointer."<<endl;
IUnknown* pI = CreateInstance();
cout<<"Client: Get Interface IX."<<endl;
IX *pIX = NULL;
hr = pI->QueryInterface(IID_IX, reinterpret_cast<void **>(&pIX));
if(SUCCEEDED(hr))
{
cout<<"Client: Succeeded getting IX."<<endl;
pIX->Fx();
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「a-ray-of-sunshine」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a_ray_of_sunshine/article/details/12683699
编写一个简单的COM组件的更多相关文章
- 使用CEF(二)— 基于VS2019编写一个简单CEF样例
使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...
- 编写一个简单的C++程序
编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
- javascript编写一个简单的编译器(理解抽象语法树AST)
javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...
- Java入门篇(一)——如何编写一个简单的Java程序
最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...
- 用 Go 编写一个简单的 WebSocket 推送服务
用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
- 用C语言编写一个简单的词法分析程序
问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
随机推荐
- printf函数返回值
//返回值:正确返回输出的字符总数,错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志. #include <stdio.h> #defi ...
- 【剑指offer】51.构建乘积数组
51.构建乘积数组 知识点:数组: 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0] * A[1] *... * A[i ...
- deepin安装Motrix,cocomusic
1,motrix(下载工具):https://motrix.app/ 2,cocomusic(开源音乐播放器):https://github.com/xtuJSer/CoCoMusic/release ...
- Python - 可变和不可变对象
前置知识 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 有哪些可变对象,哪些不可变对象? 不可变对象:字符串.元组.数字(int.flo ...
- DNS的原理和解析过程
DNS的解析原理和过程: 在Internet上域名和IP是对应的,DNS解析有两种:一种是正向解析,另外一种是反向解析. 正向解析:正向解析就是将域名转换成对应的 IP地址的过程,它应用于在浏览器地址 ...
- mapGetters 的作用__为什么mapGetter前面有...(三个点是去掉{}的作用)
参考:vuex 中关于 mapGetters 的作用 mapGetters 工具函数会将 store 中的 getter 映射到局部计算属性中.它的功能和 mapState 非常类似,我们来直接看它的 ...
- 如何获取SQL Server数据库连接字符串的某些部分
有的时候需要获取SQL Server数据库连接字符串的某些部分.用正则表达式可能有点麻烦. 其实有一个比较简单的方法--使用SqlConnectionStringBuilder. var builde ...
- RecyclerView跳转到指定位置的几种种方式
Mark一下: http://blog.csdn.net/huangxiaoguo1/article/details/53706971 https://www.jianshu.com/p/3acc39 ...
- git分支merge冲突 error: you need to resolve your current index first
问题: 执行切换代码分支 git checkout featrue_2019-06-24 ,报错如下: error: you need to resolve your current index fi ...
- 什么是CIDR?
英文缩写: CIDR (Classless InterDomain Routing) 中文译名: 无类别域间路由选择 IP地址有"类"的概念,/8掩码是A类,/16掩码是B类,/2 ...