`
king_c
  • 浏览: 223552 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用ATL创建进程外组件

 
阅读更多

一、建立一个进程外组件
1)打开菜单File|New,选择Projects标签,然后选择“ATL COM AppWizard”
2)在Project name栏输入step02,单击ok按钮,下一个窗口中的Server Type栏选
“Executable (Exe)”之后,单击Finish按钮

然后插入对象(与创建进程内组件类似):
3)打开菜单Insert|New ATL Object,在左边的Category中选择Objects,在右边的
Objects中选择Simple Object,单击“Next”按钮
4)在Names标签中,Short Name栏填写Simple02,不修改其他的属性,单击
“确定”按钮。

加入接口方法:
5)在Workspace的ClassView标签中右击“ISimple02”接口,从弹出的菜单中选择
“Add Method”,在弹出的窗口中,Method Name栏填写GetOSVersion,Parameters
栏填写[out, retval]BSTR * bstrVersion

修改类CSimple02的函数STDMETHODIMP CSimple02::GetOSVersion(BSTR *bstrVersion)如下:


// Simple02.cpp : Implementation of CSimple02
#include "stdafx.h"
#include "Step02.h"
#include "Simple02.h"

// 加入comutil支持
#include <comutil.h>
#pragma comment( lib, "comsupp.lib" )

/////////////////////////////////////////////////////////////////////////////
// CSimple02

// 取操作系统信息
STDMETHODIMP CSimple02::GetOSVersion(BSTR *bstrVersion)
{
 char szOSVersion[10];
 OSVERSIONINFO VersionInformation;
        VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 if(GetVersionEx(&VersionInformation))
 {
  switch(VersionInformation.dwPlatformId)
  {
  case VER_PLATFORM_WIN32s:
   strcpy(szOSVersion, "WIN32S");
   break;
  case VER_PLATFORM_WIN32_WINDOWS:
   strcpy(szOSVersion, "WIN95/98");
   break;
  case VER_PLATFORM_WIN32_NT:
   strcpy(szOSVersion, "WINNT");
   break;
  default:
   strcpy(szOSVersion, "UnKnown");
   break;
  }
 }
 else
 {
  strcpy(szOSVersion, "Error");
 }
 *bstrVersion = _com_util::ConvertStringToBSTR(szOSVersion);
 return S_OK;
}

编译程序,至此我们建立了一个进程外组件,下面我们编译proxy/stub程序
6)进入“MS DOS”状态,找到Step02的目录,运行nmake step02ps.mk,将创建一个
名为Step02ps.dll动态连接库。


二、建立客户程序
1)打开菜单File|New,选择Projects标签,然后选择“Win32 Console Application”
2)在Project name栏输入Client,单击ok按钮,在下一个窗口单击Finish按钮

新建如下文件,并加入工程:
// Client.cpp 文件

#include <windows.h>
#include <stdio.h>
// 加入comutil支持
#include <comutil.h>
#pragma comment( lib, "comsupp.lib" )

// 包含com的定义文件,以下两个文件从step02中拷贝出来
#include "..\step02\step02.h"
#include "..\step02\step02_i.c"

void main()
{
 ISimple02 * pISimple02=NULL;  // 我们定义的接口
 BSTR  bstrOS;

 // 初始化
 HRESULT hr = CoInitialize(NULL);
 if(FAILED(hr))
 {
  printf("Coinitialize failed! hr=0x%x", hr);
  return ;
 }

 // 创建COM对象
 hr = CoCreateInstance(CLSID_Simple02, NULL, CLSCTX_ALL,
                    IID_ISimple02, (void **)&pISimple02);
 if(FAILED(hr))
 {
  printf("create com failed! hr=0x%x", hr);
  CoUninitialize();
  return ;
 }
 // 获得操作系统
 hr = pISimple02->GetOSVersion(&bstrOS);
 if(FAILED(hr))
 {
  printf("pISimple02->GetOSVersion() failed! hr=0x%x", hr);
  pISimple02->Release();
  CoUninitialize();
  return ;
 }
 char *pszOS;
 pszOS = _com_util::ConvertBSTRToString(bstrOS);
 printf("The OS is %s\n", pszOS);

 // 释放分配的内存
 SysFreeString(bstrOS);
 delete pszOS;
 pISimple02->Release();
 CoUninitialize();

 return ;
}

三、说明
1)进程外组件的注册使用:
  step02.exe /regserver
  注销使用:
  step02.exe /unregserver

在windows 98下运行我们的Client.exe,可以得到
The OS is WIN95/98
在windows 2000下运行我们的Client.exe,可以得到
The OS is WINNT

四、常见问题
如果没出现上面的结果,提示为:
create com failed! hr=0x80040154
解决方法是,进入MS DOS方式,找到step02\debug目录,运行step02.exe /regserver
再试一次。

分享到:
评论

相关推荐

    ATL创建进程外COM组件服务(C++)

    ATL创建进程外COM组件服务,包含COM组建客户端测试程序,使用时,需要先通过批处理文件将COM组建服务注册到Windows系统中(win10测试通过),具体可参考我的文章《ATL创建进程外COM组件服务(C++图解说明)》

    COM初学者,使用ATL创建COM组件

    在“COM初学者,使用ATL创建COM组件”的主题中,我们将深入理解如何利用ATL来构建一个基本的COM组件。首先,了解COM的基本概念至关重要。COM定义了一种二进制标准,使得组件可以在不关心它们是如何实现的情况下进行...

    atl 进程外com组件接口调用实例(代码)

    ProcOut为.exe的进程外组件 ProOutTest为调用组件的应用程序 程序用VC++6.0编写,实现生产者消费者模型 ====================================================== ProcOut用Debug编译 ===========================...

    CPP.rar_ATL_teacherj4m_进程外组件

    **标题:“CPP.rar_ATL_...总之,这个“CPP.rar”包为学习和实践ATL创建进程外组件提供了宝贵的资料,涵盖了从基础的ATL概念到具体的实现细节。对于想要深入理解COM和ATL的开发者来说,这将是一个很好的学习起点。

    atl,com,进程外服务器

    在ATL中,创建进程外服务器涉及以下几个关键知识点: 1. ATL项目模板:Visual Studio提供了ATL COM AppWizard,可以帮助开发者快速设置一个基础的ATL项目,其中包括必要的COM接口定义和实现。 2. COM类映射:ATL...

    ATL com组件创建和调用.zip

    在本教程中,我们将探讨如何使用Visual Studio来创建和调用ATL COM组件。 首先,创建一个ATL项目。在Visual Studio中,选择"新建项目",然后在模板列表中找到"ATL COM"类别。可以选择"ATL简单对象"模板,这是一个...

    VC6.0_ATL_COM.rar_ATL_COM 组件_atl com vc6_com atl_vc6.0 ATL

    在本资源"VC6.0_ATL_COM.rar"中,我们将深入探讨如何在VC6.0环境下使用ATL创建COM组件,并了解如何在实际项目中应用和调用这些组件。 首先,COM是一种跨语言、跨平台的软件接口技术,允许不同进程中的对象进行交互...

    ATL制作COM组件

    ATL(Active Template Library)是Microsoft开发的一个C++库,主要用于简化COM...通过深入理解上述知识点,并结合提供的Demo,开发者可以熟练掌握使用ATL创建COM组件的技巧,为Windows平台的软件开发打下坚实的基础。

    VC++编写COM组件教程

    - 通过本教程,你将掌握使用VC++和ATL创建COM组件的基础知识,了解如何在VB中调用这些组件,并理解如何编写复杂的COM组件。 以上内容涵盖了创建和使用COM组件的基本知识,通过学习和实践,你可以熟练地利用VC++...

    使用VC++编写ATL COM和测试COM

    在实际的项目开发中,ATL COM组件可能被用作服务、控件或者模块,用于跨进程甚至跨机器通信。测试这部分通常涉及验证接口方法的正确性,包括参数校验、异常处理以及正确返回值的测试。同时,还要确保在多线程环境下...

    代理存根的创建(进程外组件)

    这是&lt;ATL开发指南源码&gt;中的一个例子,由于缺少代理存根DLL,是的客户端调用进程外组件接口失败. 实现的步骤见http://blog.csdn.net/tttyd/archive/2009/11/04/4768041.aspx

    利用ATL编写COM组件.ppt

    15.2章节介绍了如何利用ATL创建COM组件,通常涉及以下几个步骤: 1. 创建ATL项目:在Visual C++中选择ATL COM控件或ATL COM DLL项目模板。 2. 定义接口:使用ATL宏定义接口,如DECLARE_INTERFACE_。 3. 实现接口:为...

    配套代码,ATLCom组件

    ATLCom组件的创建和使用是C++程序员在开发COM对象时常常采用的技术,尤其适用于快速构建COM服务器,如DLL或EXE。以下是对ATLCom组件及其相关知识点的详细说明: 1. ATL简介:ATL是Microsoft为C++开发者设计的一个...

    ATL开发指南 vc Atl编程

    通过最小化虚函数调用和减少内存分配,ATL创建的对象通常比使用MFC或其他方法创建的同等组件更快。 11. **ATL COM ATL Threading Models**:ATL提供了多种线程模型,如Single Threaded Apartment (STA)、Multi ...

    手写ATLCOm组件

    8. 测试ATL COM组件:你可以使用COM+服务或者OLE Automation测试工具(如Visual Basic的VBA环境)来测试你的手写组件,验证它们是否能够正确注册、实例化并执行预期功能。 通过深入学习和实践手写ATL COM组件,不仅...

    ATL编程指南及源码和COM微软组件对象模型

    在"ATL编程指南及源码"中,你将找到关于如何使用ATL创建COM对象的详细步骤,包括如何定义接口、实现接口、注册组件以及调试和测试。此外,源码实例将帮助你更好地理解理论知识的实际应用。 "COM微软组件对象模型...

    两个 ATL COM 组件源代码参考例子

    通过深入分析和实践这两个示例,你可以更好地理解如何使用 ATL 来创建高效、灵活的 COM 组件,以及如何在实际项目中应用这些组件。同时,这也对提升你的 Windows API 和 C++ 编程技能大有裨益。

    VC中使用ATL编写控件

    - ATL Server可以创建基于HTTP的Web服务,使得ATL组件能在Internet上使用。 总结,使用VC2005和ATL编写ActiveX控件是一种高效的方式,它能够快速地创建具有复杂功能的Windows控件。ATL的模板和宏大大简化了COM编程...

    使用ATL简单COM指南.rar

    以上就是使用ATL创建简单COM组件的基本过程。ATL还支持更复杂的功能,如接口多重继承、事件处理、自动化支持等。通过深入学习ATL,开发者可以构建高效、可复用的COM组件,用于各种服务器端应用程序。

Global site tag (gtag.js) - Google Analytics