分享
 
 
 

Developing COM Components using VC-ATL(2-5)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

对组件的十一个文件的剖析

一、stdafx.h

代码选取

#define STRICT

#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0400

#endif

#define _ATL_APARTMENT_THREADED

#include <afxwin.h>

#include <afxdisp.h>

#include <atlbase.h>

//You may derive a class from CComModule and use it if you want to override

//something, but do not change the name of _Module

extern CComModule _Module;

#include <atlcom.h>

代码剖析

n 包含了ATL头文件

#include <atlbase.h>

#include <atlcom.h>

n 两个声明

#define _ATL_APARTMENT_THREADED

定义了将成为apartment模型的DLL默认线程模型。

_Module是CComModule类型的对象,CComModule实现了COM服务器的基本功能,实现并提供了诸如注册、实例化所支持对象以及通过对象映射管理生命周期等服务。注意因为它通过ATL头文件所引用,所以CComModule对象必须是全局的且必须命名为_Module。

另外,这个类也是ATL的中心,正如主函数对任何程序的入口点(C/C++),这个类的模块对象处理几个任务,如:服务器锁计数、注册本地服务器的类工厂、根据注册表注册和反注册。

二、stdafx.cpp

#ifdef _ATL_STATIC_REGISTRY

#include <statreg.h>

#include <statreg.cpp>

#endif

#include <atlimpl.cpp>

三、MyProj.def输出定义文件

代码选取

; MyProj.def : Declares the module parameters.

LIBRARY "MyProj.DLL"

EXPORTS

DllCanUnloadNow @1 PRIVATE

DllGetClassObject @2 PRIVATE

DllRegisterServer @3 PRIVATE

DllUnregisterServer @4 PRIVATE

代码剖析

也称模块定义文件,只有进程内服务器DLL才产生,它提供了被链接程序的信息(DLL文件的名字)

四、MyProj.tlb类型库

编绎后生成,客户端使用时用#import方式导入之。

五、MyProj.idl接口定义语言文件

代码选取

import "oaidl.idl"; //此文件包括IDispatch接口的定义,import相当于#include

import "ocidl.idl";

[

object,

uuid(65460F9C-3BAB-4055-885A-8ED59F5FA9B0),

dual,

helpstring("IMyCom Interface"),

pointer_default(unique)

]

interface IMyCom : IDispatch

{

[id(1), helpstring("method MyF1")] HRESULT MyF1();

[id(2), helpstring("method MyF2")] HRESULT MyF2([in] BSTR str,[out, retval] int* val);

[id(3), helpstring("method MyF3")] HRESULT MyF3([in] BSTR str,[out, retval] BSTR* retstr);

[id(4), helpstring("method MyF4")] HRESULT MyF4([in] int x,[out, retval] int* val);

};

[

uuid(FE651184-11DE-4D01-BD69-B07DDFA12D0C),

version(1.0),

helpstring("MyProj 1.0 Type Library")

]

library MYPROJLib

{

importlib("stdole32.tlb");

importlib("stdole2.tlb");

[

uuid(FEB7BDEF-FB6F-446B-BE31-DF0A3AD391BA),

helpstring("MyCom Class")

]

coclass MyCom

{

[default] interface IMyCom;

};

};

代码剖析

IDL文件由三部分组成,每部分又都由一对中括号和一对大括号组成。每部分也都包含一个UUID来唯一的标识自己

n 接口部分:COM接口定义

[

object,

uuid(65460F9C-3BAB-4055-885A-8ED59F5FA9B0), //接口唯一标识符(GUID/IID)

dual, //表示客户机可用两种方法访问这个接口,一种是支持指针的非脚本语言,如VC;一种是非脚本语言,如VB、ASP

helpstring("IMyCom Interface"), //将提示字符串与此接口建立联系

pointer_default(unique) //指定除参数表中所列属性之外所有指针的缺省特征,unique表示指针可以是NULL,但不支持别名

]

interface IMyCom : IDispatch

{

[id(1), helpstring("method MyF1")] HRESULT MyF1();

[id(2), helpstring("method MyF2")] HRESULT MyF2([in] BSTR str,[out, retval] int* val);

[id(3), helpstring("method MyF3")] HRESULT MyF3([in] BSTR str,[out, retval] BSTR* retstr);

[id(4), helpstring("method MyF4")] HRESULT MyF4([in] int x,[out, retval] int* val);

};//接口中的方法

n 类型库部分

[

uuid(FE651184-11DE-4D01-BD69-B07DDFA12D0C),

version(1.0),

helpstring("MyProj 1.0 Type Library")

]

library MYPROJLib

{

importlib("stdole32.tlb");

importlib("stdole2.tlb");

<组件类部分>

};

n 组件类部分(组件类嵌套在类型库里面)

[

uuid(FEB7BDEF-FB6F-446B-BE31-DF0A3AD391BA),

helpstring("MyCom Class")

]

coclass MyCom

{

[default] interface IMyCom;

};

手工为接口添加一个方法,该修改哪些地方?

假设组件类名叫CMyCom,接口叫IMyCom,要加入的方法是MyF5。

首先在IDL文件中找到接口IMyCom的定义,在其中加入如下方法定义:

[id(5), helpstring("method MyF5")] HRESULT MyF1([out,retval] VARIANT_BOOL *ret);

注意:id中的数字不要和已经存在的id重复。

其次,在CMyCom的类定义头文件中加入如下成员函数声明:

public:

STDMETHOD(MyF5)(/*[out, retval]*/ VARIANT_BOOL *ret);

最后,在CMyCom类的实现Cpp文件中加入函数的实现:

STDMETHODIMP CMyCom::MyF5(VARIANT_BOOL *ret)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here

*ret = VARAINT_TRUE;

return S_OK;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有