频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

VC环境下利用ATL开发COM组件

来源:论坛 作者:张喜平 李永涛 出处:巧巧读书 2006-08-14 进入讨论组
关 键 词:access  c++  ie  java  mfc  
上一页 1 2 
4. 利用ATL创建组件的实例

  4.1. 创建步骤

  首先在VC集成环境里建立一个新的工程,即从New对话框中Projects选项卡上选择ATL COM AppWizard,然后,输入工程的名字和其位置,工程的名字将成为最终生成的DLL或EXE文件的名字。点击OK按钮,其它的接受默认设置即可。现在即可在此项目里创建COM对象。在VC5.0以后的版本,在“Insert”菜单中点击“New ATL Object”菜单项,就弹出ATL Object Wizard对话框,它分为左右两个框,在左边框里选择“Objects”,在右边框里选择“Simple Object”,然后点击“Next”按钮。于是ATL Object Wizard Properties对话框将出现,在“Names”选项卡的“Short Name”中输入组件对象的名字,其它的属性会自动被填入,你也可以编辑改变它们。在“Attributes”选项卡中,接受默认设置即可。如有必要,可将线程模式改为“Both”,如果需要报告详细错误信息,可将“Support I Support Error Info”选中。

  4.2. 创建实例和代码

  下面以一个具体的实例实现一个组件DataAccess,它是将指定文件中的内容读取出来并存储在一个数组中,其短名字为ReadFile。此组件有一个方法:LoadFile,为了判断文件读取是否成功,应使得此方法的最后一个参数为布尔型返回值,并声明类型为[out, retval]。如是VC4.2版,在DataAccess.idl文件IReadFile:Idispatch块中加入如下代码:

   [helpstring("Read File Data")] HRESULT LoadFile([in]BSTR FileName, [out,retval]BOOL* result);  

  如果是在VC5.0以后的版本中,在ClassView中右击IReadFile,在弹出的对话框中输入方法的名字LoadFile及其参数:

[in]BSTR FileName, [out,retval]BOOL* result

  当点击“OK”后,相关的代码将被增加到.IDL,.H和.CPP文件中。在ReadFile.cpp文件中增加LoadFile方法如下:

STDMETHODIMP CReadFile:: LoadFile (BSTR FileName,BOOL* result)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())
 CStdioFile f;
 CString FileData;
 Cstring Datas[255]; //用于存放从文件中读出的数据
 int i=0; //数组下标
 USES_CONVERSION;
 if(f.Open(W2A(FileName),CFile::modeRead))
 { //文件成功打开
  while(f.ReadString(FileData))
  { //处理读出的数据
   Datas[i]= FileData;
   i++;
  }
  f.Close();
  *result=true;
  return S_OK; //关闭文件,返回结果为真
 }
 else
 { //文件打开失败
  *result=false; //返回参数为false
  return E_FAIL;
 }
}

  4.3. 测试

  为了测试所写的组件,可以编写一个测试程序。在New对话框中Projects选项卡上选择Win32 Console Application,输入工程名为test,选择“Add to current workspace”,并并将”Deendency of:”选项打勾。点击“OK”,其余的接受默认设置即可。现在即可在此工程里测试刚才所编写的组件。在test.cpp中,增加

#include <atlbase.h>
#include "..\DataAccess_i.c"
#include "..\DataAccess.h"

  在main主函数中包含如下语句:

IReadFile * pIRF=NULL;
BOOL result=false;
//初始化com库
HRESULT hr=::CoInitialize(NULL);
if(FAILED(hr))
{ //初始化失败
 return -1;
}
hr=::CoCreateInstance(CLSID_ReadFile,NULL,CLSCTX_INPROC_SERVER,IID_IReadFile, (void**)&pIRF);
if(FAILED(hr))
{ //创建组件实例失败
 return -1;
}
USES_CONVERSION;
CString FILENAME=".\\Palette.txt";
hr=pIRF->LoadFile(A2W(FILENAME),&result);
if(FAILED(hr))
{
 return -1;
}

  为了验证组件是否完成所要求的功能,可在组件及测试程序中加入适当的输出语句。

  以上程序在VC6.0中编译并测试通过,所编写的组件能够很好地完成要求。

  5. 结束语

  组件技术得到越来越广泛的应用,而VC提供的活动模板库为我们创建功能强大的COM组件提供了很好的框架。我们相信,本文总结的COM组件编写方法能对其他人员编写类似的组件程序有所帮助。

  参考文献

[1] Dale Rogerson. Inside COM Microsoft Press,1997
[2] David J.Kruglinski. Inside Visual C++,4th Edition[M] Microsoft Press,1997
[3] Brent Rector, Chris Sells. ATL Internals Addison-Wesley Inc,2001
[4] Eugene Olafsen, Kenn Scribner, K.David White. MFC Programming with Visual C++6 Unleashed
Sams Publishing, 2000
[5] 候俊杰. 深入浅出MFC 第二版 松岗电脑图资料股份有限公司,1997 更多文章 更多内容请看Wlan组网----家庭专题专题,或进入讨论组讨论。
上一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
·Wlan组网----家庭专题 (3465篇文章)
热点标签: access  c++  ie  java  mfc  
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容
 
Web 本站
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章