`
king_c
  • 浏览: 214613 次
  • 性别: 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组件,并测试COM组件的小例子

    atl,com,进程外服务器

    atl,com,进程外服务器

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

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

    深入解析ATL(第2版).pdf

    4.7 ATL创建者 4.8 调试 4.9 总结 第5章 COM服务器 5.1 回顾COM服务器 5.2 对象映射表和CAtlModule类 5.3 对象映射表 5.4 对象映射类要求的方法 5.5 CAtlModule类 5.6 重游CComCoClass 5.7 ATL与C运行时库 5.8 总结 ...

    Visual C++实践与提高-COM和COM+篇『PDF』

    7.3.1 利用ATL COM AppWizard创建进程外组件 7.3.2 分析ATL进程外组件与进程内组件的差别 7.3.2.1 文件生成差别 7.3.2.2 StdAfx.h文件差别 7.3.2.3 ATLSampleExe.cpp文件差别 7.3.3 增加COM对象类、属性和方法 7.3.4...

    COM技术内幕——微软组件对象模型--随书源代码

    1.1 使用组件的优点 2 1.1.1 应用程序的定制 2 1.1.2 组件库 3 1.1.3 分布式组件 3 1.2 对组件的需求 4 1.2.1 动态链接 4 1.2.2 信息封装 5 1.3 COM 6 1.3.1 COM组件是…… 7 1.3.2 COM不是…… 7 1.3.3 ...

    《用纯粹的C++编写COM组件》配套VC源代码

    本文提供一个完全用C++实现的进程内(DLL)COM服务器,不要ATL或MFC提供任何支持。用这种方式编写COM对象可以让你深入地洞察到COM处理进程内服务器的方法以及COM是如何创建类工厂的。利用本文提供的这个简单框架你...

    100实例(c++)

    58 确定正在运行的进程 59 文件变更通知 60 重新启动和关闭计算机 61 字体选择组合框 62 设置显示器分辨率 63 Vc++中IO的应用 64 以二进制形式查看文件 65 串行化功能的实现 66 独特的读写工具 67 打开PCX格式文件 ...

    《VC++.NET精彩百例》配套代码

    实例 52 系统进程检测 实例 53 获取系统信息 实例 54 获取文件夹路径 实例 55 设定系统时间 第5章 线程操作与COM组件编程 实例 56 创建线程 实例 57 线程间的通信 实例 58 使用自定义消息 实例 59 线程间的...

Global site tag (gtag.js) - Google Analytics