新建ATL Project,工程名命名为MyAtlCom;

  出现工程 向导,一路“Next”;

  Add class,点击添加 ATL Simple Object , 类名CStatistic, 接口IStatistic,“Next”到底;

  打开类视图,可以看到ATLCOM下新增了CStatistic类和IStatistic接口;

  在ISample上右键,Add->Add Method (或Add Property...)来丰富接口了,然后在CStatistic内实现相应的的方法(属性)即可。

  

  增加一个Add方法:

  STDMETHOD(Add)(LONG nNum1, LONG nNUm2, LONG* nRet);

  STDMETHODIMP CStatistic::Add(LONG nNum1, LONG nNUm2, LONG* nRet)
  {
     // TODO: Add your implementation code here *nRet = nNum1 + nNUm2;
    return S_OK;
  }

  编译运行,生成MyAtlCom.dll,并注册到Windows中去。

  下面,测试上述生成的COM组件MyAtlCom.dll

  新建一个Win32控制台应用程序,取名MyAtlComTest 

#include "stdafx.h"
#include<iostream>
using namespace std;
#include "../MyAtlCom/MyAtlCom_i.h"
#include "../MyAtlCom/MyAtlCom_i.c" int _tmain(int argc, _TCHAR* argv[])
{
IStatistic * pIStatisticATL = NULL;
HRESULT hr = CoInitialize(NULL);     //初始化COM //使用SUCCEEDED宏并检查我们是否能得到一个接口指针
if(SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_Statistic,
NULL,
CLSCTX_INPROC_SERVER,
IID_IStatistic,
(void **)&pIStatisticATL);
//如果成功,则调用Add方法,否则显示相应的出错信息
if(SUCCEEDED(hr))
{
LONG nReturnValue;
pIStatisticATL->Add(, , &nReturnValue);
cout << "The Add result for 8 + 9 is " << nReturnValue << endl;
pIStatisticATL->Release();
}
else
{
cout << "CoCreateInstance Failed." << endl;
}
}
CoUninitialize();    //释放COM
return ;
}

  结果:

  

  或使用IDispath接口

#include "stdafx.h"  

#include <atlbase.h>
#include <atlcom.h>
#include <iostream>
using namespace std; #include "../MyAtlCom/MyAtlCom_i.h"
#include "../MyAtlCom/MyAtlCom_i.c" int _tmain(int argc, _TCHAR* argv[])
{
CoInitializeEx(NULL, COINIT_MULTITHREADED); CComPtr<IStatistic> spCar;
spCar.CoCreateInstance(CLSID_Statistic); // use IDispatch
DISPID PropertyID[] = {};
BSTR PropName[]; PropName[] = SysAllocString(L"Add");
HRESULT hr = spCar->GetIDsOfNames(IID_NULL, PropName, , LOCALE_SYSTEM_DEFAULT, PropertyID); SysFreeString(PropName[]); CComVariant avarParams[];
avarParams[].vt = VT_I4;
avarParams[] = ; avarParams[].vt = VT_I4;
avarParams[] = ; LONG vTotal = ;
avarParams[].vt = VT_I4 | VT_BYREF;
avarParams[] = &vTotal; DISPPARAMS params = { avarParams,
NULL, // Dispatch identifiers of named arguments.
, // Number of arguments.
}; // Number of named arguments.
CComVariant Result;
hr = spCar->Invoke(PropertyID[], IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &Result, NULL, NULL); cout << "The Add function result is " << (int)(*params.rgvarg->plVal) << endl; spCar.Release(); CoUninitialize();    cin.get();
return 0;
}

  结果:

  

  

  使用COleDispatchDriver封装类

#include "stdafx.h"  

#include <atlbase.h>
#include <atlcom.h>
#include <iostream>
using namespace std; #include "../MyAtlCom/MyAtlCom_i.h"
#include "../MyAtlCom/MyAtlCom_i.c" int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); COleDispatchDriver disp;
COleException *e = new COleException; try {
// Create instance of MyAtlCom Control by using CLSID.
if (disp.CreateDispatch(CLSID_Statistic, e))
{
static BYTE params[] = VTS_I4 VTS_I4 VTS_I4;
LONG nNum1 = ;
LONG nNum2 = ;
LONG nAdd = ; disp.InvokeHelper(0x01,
DISPATCH_METHOD,
VT_EMPTY,
NULL,
params,
nNum1, nNum2, &nAdd); if (nAdd == nNum1 + nNum2)
AfxMessageBox(_T("InvokerHelper successed!"));
else
{
CString cStr;
cStr.Format(_T("InvokerHelper Failed! Error %d"), GetLastError());
AfxMessageBox(cStr);
}
}
else
throw e; } //Catch control-specific exceptions.
catch (COleDispatchException * e)
{
CString cStr; if (!e->m_strSource.IsEmpty())
cStr = e->m_strSource + " - ";
if (!e->m_strDescription.IsEmpty())
cStr += e->m_strDescription;
else
cStr += "unknown error"; AfxMessageBox(cStr, MB_OK,
(e->m_strHelpFile.IsEmpty())? :e->m_dwHelpContext); e->Delete();
} e->Delete(); CoUninitialize(); cin.get();
return ;
}

  本文源码下载:仅供学习参考

  百度云:http://pan.baidu.com/s/1pL13D03   密码:88ix

  

VC++ : VS2008 使用ATL开发COM组件的更多相关文章

  1. 用ATL开发和部署ActiveX网页控件

    用ATL开发和部署ActiveX网页控件 摘 要 ActiveX插件技术广泛的运用于B/S系统中,本文通过一个项目实例,详细介绍用ATL开发和部署ActiveX网页控件的过程.学习使用ActiveX让 ...

  2. ATL实现COM组件

    参考文献:https://blog.csdn.net/Marcus2006/article/details/41978799 ATL实现COM组件比较简单,关键是在程序中如何调用该组件. vs2010 ...

  3. VC 中的ATL ActiveX 和 MFC ActiveX 有什么区别

    原文转自 https://www.cnblogs.com/zhwl/archive/2012/11/29/2794509.html ATL是ActiveXTemplateLibrary的缩写,它是一套 ...

  4. ATL开发 ActiveX控件的 inf文件模板

    ATL开发 ActiveX控件的 inf文件模板    

  5. iOS开发之组件化架构漫谈

    前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目.在重构项目之前涉及到架构选型的问题,我和组里小伙伴一起研究了一下组件化架构,打算将项目重构为组件化架构.当然不是直接拿来照搬,还是 ...

  6. 使用OC开发phonegp 组件

    使用OC开发phonegp 组件 1. 使用oc 对phonegp中的组件近些开发,首先具体的pgonegp跟nativecode之间的一些优劣就不说了,开发phonegp 对应的组件主要就是使用na ...

  7. 【小程序】小程序开发自定义组件的步骤>>>>>>>>>小程序开发过程中报错:jsEnginScriptError

    报错:jsEnginScriptError VM6342: jsEnginScriptError Component is not found in path "component/spac ...

  8. web前端开发常用组件

    web前端开发常用组件 1. 对话框(dialog):jbox(适合对话框等其它功能).colorbox(也很强大,可以弥补jbox图片轮播的落点),      这二者基本能搞定所有对话框的情况 2. ...

  9. 038——VUE中组件之WEB开发中组件使用场景与定义组件的方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. .NET url 的编码与解码

    举例: aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af看起来好像是不一样,其实他们都是对".net技术&q ...

  2. hdoj1171 Big Event in HDU

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. gulp的使用以及Gulp新手入门教程

    Gulp新手入门教程 原文  http://w3ctrain.com/2015/12/22/gulp-for-beginners/ Gulp 是一个自动化工具,前端开发者可以使用它来处理常见任务: 搭 ...

  4. uboot的lds文件分析

    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") ...

  5. 【转载】用Pwnage + Redsnow 制作完美越狱固件

    [转载] 现在貌似IOS 7.X系 大行其道,就算不是IOS7.X ,很多人也装着IOS 6.X系. 进入正文前首先介绍一下自己的装备 设备:iphone4 GSM 大陆行货 (内部版本3,1) 为什 ...

  6. ld,连接器

    连接器的功能,是将一个可执行程序所需的目标文件和库文件最终整合为一体.一个程序通常包含传统的三个段,.test, .data, .bss段.连接器的功能就是将各个目标文件个库文件中的三个段进行合并. ...

  7. 使用寄存器点亮LED——编程实战

    stm32的编程和stc89c51还是存在着很多思想上的不同的,在51单片机中,我们点亮LED灯,只用给对应IO高低电平就可以了,而stm32中,就一个简单的GPIO,我们也需要配置好几个寄存器,而且 ...

  8. pygame--颜色变化

    #_*_coding:utf-8_*_ import pygame from pygame.locals import * from sys import exit pygame.init() scr ...

  9. Java中常见的异常__

    作为一名游戏开发者,程序员,很自然必须熟悉对程序的调试方法.而要调试程序,自然需要对程序中的常见的异常有一定的了解,这些日子很多朋友都提出了很多问题,都是关于游戏中的报错,因此在这里我将一些常见的程序 ...

  10. Clock函数用法

    clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock(void) ; 这个函数返回从“开启这个程序进程 ...