分享
 
 
 

Developing COM Components using VC-ATL(1)

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

用ATL创建COM组件

一、创建一个模型(工程) MyProj。

二、给模型(工程)增加一个组件 MyCom。

三、给组件增加方法(函数) MyF1、MyF2、MyF3、MyF4。

一、创建模型(工程) MyProj

在VC++6.0工作平台中,点击菜单 File 下的 New 菜单项,在出现的 New 对话框中选中 Projects 卡片,在列表框中选中 ATL COM AppWizard(活动模板库组件导航)。

在 Project Name 编辑框中输入项目名如 MyProj ,并选择合适的 Location 后,按确认按钮进入下一个对话框:ATL COM Appwizard - step 1 of 1,在 Server Type 中选择 Dynamic Link Library [ DLL ],即进程内服务器,这是最快的组件。

选中 Support MFC 选择项。

在按下 Finish 和 Ok 按钮后,一个组件的框架已经建立。

二、给模型增加组件MyCom

在VC++ 菜单 Insert 中选中 New ATL Object…菜单项,出现 ATL Object Wizard 对话框。

在左边的 Category 中选择 Objects,右边的 Objects 中选中 Simple Object 项。按 Next 按钮。

在出现的 ATL Object Wizard 属性对话框中 Names 卡片中的八个编辑框中左上方的 Short Name 编辑框中输入短名如 MyCom ,其他七个编辑框的内容会自动生成。然后按确认按钮退出。

三、给组件增加方法(函数) MyF1、MyF2、MyF3、MyF4

在 VC++工作平台的左边的 Workspace 的 ClassView 卡片中找到接口 IMyCom 项,按右键,在出现的快捷菜单中选择 Add Method …,出现 Add Method to Interface 对话框,在对话框中输入要增加的函数的函数名、参数和返回值类型。然后,按确认按钮退出。

先增加函数 MyF1:

函数名为: MyF1

参数:无

在MyCom.cpp文件中插入代码:

STDMETHODIMP CMyCom::MyF1()

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here

AfxMessageBox("欢迎使用我的组件");

return S_OK;

}

用同样的方法给组件增加函数MyF2:

函数名为: MyF2

参数为:

[in] BSTR str,

[out, retval] int* val

插入代码:

STDMETHODIMP CMyCom::MyF2(BSTR str, int *val)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here

CString sStr(str);

int n = sStr.GetLength();

*val = n;

return S_OK;

}

用同样的方法给组件增加函数 MyF3:

函数名为: MyF3

参数为:

[in] BSTR str,

[out, retval] BSTR* retstr

插入代码:

STDMETHODIMP CMyCom::MyF3(BSTR str, BSTR *retstr)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here

CString sStr(str);

CString sRetstr = "组件收到你的信息:<" + sStr + ">\n特此告之。";

CComBSTR temp(sRetstr);

*retstr = temp;

return S_OK;

}

用同样的方法给组件增加函数MyF4:

函数名为: MyF4

参数为:

[in] int x,

[out, retval] int* val

插入代码:

STDMETHODIMP CMyCom::MyF4(int x, int *val)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here

*val = x+1;

return S_OK;

}

编绎工程,生成组件DLL。

如果是在 Win2k 或者 WinXp 的计算机上完成了上面的三步操作,就会在 debug 子目录下生成组件的 DLL 文件,并且完成自动注册。但是在 Win98 的计算机上,注册要运行如下命令才能完成:

regsrv32 C:\MyProj\Debug\MyProj.dll

创建 COM 组件客户

1,创建一个基于对话框的客户程序。

2,把服务器类型库导入客户工作平台。

3,初始化 COM 库。

4,获得服务器的 GLSID。

5,创建 COM 组件服务器组件的实例。

6,使用 COM 对象。

7,终止 COM 库。

1,创建一个客户程序

用 MFC AppWizard ( exe ) 创建一个基于对话框的应用程序 MyExe。

在对话框中放置四个按钮,分别为 MyF1、MyF2 、MyF3和 MyF4。

用 ClassWizard 生成单击按钮的四个响应函数 OnMyF1() 、OnMyF2() 、OnMyF3()和 OnMyF4()。

2,把服务器类型库导入客户

2-1在 StdAfx.h 文件中加入代码:

#import "..\MyProj\MyProj.tlb"

最后的StdAfx.h文件如下:

// stdafx.h : include file for standard system include files,

// or project specific include files that are used frequently, but

// are changed infrequently

//

#if !defined(AFX_STDAFX_H__2B646017_28AD_4CDE_9792_CB8F9A5C6B39__INCLUDED_)

#define AFX_STDAFX_H__2B646017_28AD_4CDE_9792_CB8F9A5C6B39__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

#include <afxwin.h> // MFC core and standard components

#include <afxext.h> // MFC extensions

#include <afxdisp.h> // MFC Automation classes

#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h> // MFC support for Windows Common Controls

#endif // _AFX_NO_AFXCMN_SUPPORT

#import "..\MyProj\MyProj.tlb"

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__2B646017_28AD_4CDE_9792_CB8F9A5C6B39__INCLUDED_)

编译 StdAfx.cpp,

这样在客户端的debug目录下生成组件的类型库头文件(.tlh)和类型库实现文件(.tli)。

2-2在使用组件的源文件上方使用名字空间,最后的源文件上面部分代码如下

// MyExeDlg.cpp : implementation file

//

#include "stdafx.h"

#include "MyExe.h"

#include "MyExeDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

using namespace MYPROJLib;

以下代码略

3,初始化 COM 库

HRESULT hr=CoInitialize(NULL);

4,获得服务器组件的 CLSID

CLSID clsid;

hr=CLSIDFromProgID(OLESTR("MyProj.MyCom"),&clsid);

if(FAILED(hr))

{

AfxMessageBox("COM Failed");

return;

}

5,创建 COM 服务器组件实例,获得组件接口指针

IMyCom *ptr = NULL;

hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IMyCom),(LPVOID*)&ptr);

6-1,在OnMyF1()中使用 COM 对象 MyF1()

ptr->MyF1();

ptr->Release(); // 释放实例

6-2,在OnMyF2()中使用 COM 对象 MyF2()

char str[32];

sprintf(str,"Len=%d",ptr->MyF2("abcdefg"));

AfxMessageBox(str);

ptr->Release();// 释放实例

6-3,在OnMyF3()中使用 COM 对象 MyF3()

AfxMessageBox(ptr->MyF3("abcdefg"));

ptr->Release(); // 释放实例

6-4,在OnMyF4()中使用 COM 对象 MyF4()

int x=8; char str[32];

sprintf(str,"x=%d,x+1=%d",x,ptr->MyF4(x));

AfxMessageBox(str);

ptr->Release();// 释放实例

7,终止 COM 库

CoUninitialize();

(未完,待续)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有