首页 > 其他分享 >编写一个简单的COM组件

编写一个简单的COM组件

时间:2023-06-09 10:04:41浏览次数:32  
标签:__ IUnknown obj CA stdcall 组件 编写 IXIYIZ COM

参考网站:编写一个简单的COM组件_a ray of sunshine

(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;

}


标签:__,IUnknown,obj,CA,stdcall,组件,编写,IXIYIZ,COM
From: https://blog.51cto.com/u_4018548/6445478

相关文章

  • odoo many2many page组件
    在Odoo中,Many2manyPage(多对多页面)组件用于在视图中显示和管理Many2many字段的关联记录。这个组件允许用户通过添加、编辑和删除相关记录来操作Many2many字段。下面是一个简单的例子,演示如何在Odoo视图中使用Many2manyPage组件:<fieldname="many2many_field"widget="many2many......
  • 视图组件
    视图继承关系 两个视图基类  APIView#fromrest_framework.viewsimportAPIViewAPIView是RESTframework提供的所有视图的基类,继承自Django的view父类 APIView与View的不同之处:传入到视图方法中的是RESTframework的Request对象,而不是Django的HttpRequeset对象;视......
  • React - 02 React的工程化/组件化开发
    我们可以基于webpack自己去搭建一套工程化打包的架子,但是这样非常的麻烦/复杂;React官方,为我们提供了一个脚手架:create-react-app!!脚手架:基于它创建项目,默认就把webpack的打包规则已经处理好了,把一些项目需要的基本文件也都创建好了!!1.create-react-app基础运用安装脚手架$npmicrea......
  • Competitive Programmer 题解
    题目传送门一道模拟题。纯模拟肯定不行,考虑优化。\(60=2^2\times3\times5\),也就是说我们判断组合后的数字能否被\(2\),\(3\),\(10\)整除即可。如果这个数能被\(2\)整除,那么原数一定会存在偶数;如果这个数能被\(3\)整除,那么它的数字和应该也能被\(3\)整除;如果这个数......
  • vue项目之vue-cli创建项目&目录结构&编写规范&es6导入导出语法
    1vue-cli创建项目#单页面应用:spa -以后vue项目就只有一个xx.html页面-定义很多组件,不可能都写在xx.html中#单文件组件(一个组件一个文件) https://v2.cn.vuejs.org/v2/guide/single-file-components.html#ad#一个组件中有的东西 1html内容:以后html都放......
  • VUE | Element组件库的 el-collapse 标签的用法
    Collapse折叠面板:通过折叠面板收纳内容区域。1.基础用法可以折叠展开多个面板,面板之间互不影响。示例代码<el-collapsev-model="activeNames"@change="handleChange"><el-collapse-itemtitle="一致性Consistency"name="1"><div>与现实生活......
  • 什么是UStaticMeshComponent?
    从《InsideUE4》的Component篇中可以得知,UE采用的是Entity-Component模型,也就是把实体赋予功能模块来让实体获得功能。UStaticMeshComponent是UnrealEngine中用于渲染静态网格模型的组件。它是用来显示静态的三维模型,如建筑、道具、地形等。具体而言,UStaticMeshComponent用于将......
  • vue之动态组件&插槽
    1.动态组件<!--<component:is="who"></component>--><!--component标签的is属性等于组件名字,这里就会显示这个组件--><!--keep-alive的使用:可以将组件缓存,后期切过来时资源不会被销毁--><!--动态组件start--><divid="trends"><button@click=&......
  • 面试之数据库SQL编写实战案例
    好多同学在面试的过程中会碰到关于SQL查询的相关案例,让手写SQL语句,直接蒙蔽的不少哦,下面以几个面试题为例,谈谈SQL的编写,有题有答案,大家可以看看参考一下:数据库的基本准备:/*NavicatMySQLDataTransferSourceServer:localhostSourceServerVersion:50168SourceH......
  • Vue组件和Vue实例的理解
    关于VueComponent:1、组件本质是一个名为VueComponent的构造函数,并且不是程序员定义的,是Vue.extend生成的2、我们只需要写组件引入<Demo/>,Vue解析时会帮我们创建demo组件的实例对象,即Vue帮我执行的:new VueComponent(options)3、特别注意:每次调用Vue.extend,返回的都是一个全......