科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC环境下利用ATL开发COM组件

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

介绍了COM的基本原理以及如何利用ATL在VC环境下开发COM组件,并给出了程序实现。

作者:张喜平 李永涛 来源:论坛 2007年10月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
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组件编写方法能对其他人员编写类似的组件程序有所帮助。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章