参考网站:编写一个简单的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组件的更多相关文章

  1. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  2. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  3. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  4. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  5. javascript编写一个简单的编译器(理解抽象语法树AST)

    javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...

  6. Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  7. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

  8. 用C语言编写一个简单的词法分析程序

    问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...

  9. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

随机推荐

  1. UFT对于PDF 文档的操作方法 VBS代码

    1.首先需要安装Adobe Acrobat,而不是Adobe Reader 2.理解AcroExch.App .AcroExch.AVDoc.AcroExch.PODoc App 主要管理应用级别的对 ...

  2. adb bat 改进

    @REM 生成随机数@echo off@REM 设置延迟变量setlocal enabledelayedexpansionset min=9set max=17set /a mod=!max!-!mi ...

  3. WIN7 32运行提示无法定位api-ms-win-crt-heap-l1-1-0.dll解决方法

    WIN7 32位无法运行adbapi-ms-win-crt-heap-l1-1-0.dll运行ADB ,提示无法定位api-ms-win-crt-heap-l1-1-0.dll需要安装https:// ...

  4. 【动画消消乐】HTML+CSS 自定义加载动画:清新折叠方块效果 063(附源码及原理详解)

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专 ...

  5. 【算法学习笔记】概率与期望DP

    本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...

  6. 【转载】Java学习笔记

    转载:博主主页 博主的其他笔记汇总 : 学习数据结构与算法,学习笔记会持续更新: <恋上数据结构与算法> 学习Java虚拟机,学习笔记会持续更新: <Java虚拟机> 学习Ja ...

  7. MapReduce学习总结之简介

    执行步骤:1)准备Map处理的输入数据 2)Mapper处理 3)Shuffle 4)Reduce处理 5)结果输出 三.mapreduce核心概念: 1)split:交由MapReduce作业来处理 ...

  8. PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制

    ‍PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制 中文 | English 项目地址:An awesome version control t ...

  9. nacos Failed to obtain JDBC Connection 连接异常

    在conf/目录下,将application.properties.example 改名为bootstrap.properties 将连接数据库信息添加到末尾 # db mysql spring.da ...

  10. Tom_No_01 IDEA tomcat 源码环境搭建

    1.下载源码 apache-tomcat-8.5.50-src 2.下载源码 放D盘,解压后根目录新建pom.xml和catalina-home pom.xml文件中内容为 <?xml vers ...