VC++ : VS2008 使用ATL开发COM组件

  新建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(8, 9, &nReturnValue);
            cout << "The Add result for 8 + 9 is " << nReturnValue << endl;
            pIStatisticATL->Release();
        }
        else
        {
            cout << "CoCreateInstance Failed." << endl;
        }
    }
    CoUninitialize();    //释放COM
    return 0;
}

  结果:

  

  或使用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[1] = {0};
    BSTR PropName[1];  

    PropName[0] = SysAllocString(L"Add");
    HRESULT hr = spCar->GetIDsOfNames(IID_NULL, PropName, 1, LOCALE_SYSTEM_DEFAULT, PropertyID);  

    SysFreeString(PropName[0]);  

    CComVariant avarParams[3];
    avarParams[2].vt = VT_I4;
    avarParams[2] = 8;  

    avarParams[1].vt = VT_I4;
    avarParams[1] = 9;  

    LONG vTotal = 0;
    avarParams[0].vt = VT_I4 | VT_BYREF;
    avarParams[0] = &vTotal;  

    DISPPARAMS params = { avarParams,
                        NULL,              // Dispatch identifiers of named arguments.
                        3,                 // Number of arguments.
                        0 };               // Number of named arguments.
    CComVariant Result;
    hr = spCar->Invoke(PropertyID[0], 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;}

  结果:

  

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

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

  

时间: 2024-11-20 05:30:07

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

使用VC2008中ATL开发浏览器控件

http://blog.csdn.net/cnjet/article/details/6218355 使用VC2008中ATL开发浏览器控件 2011.03.02 [email protected] 介绍 本文将介绍使用VC2008中的ATL开发一个用于网络部署的cab控件包的过程. 建立ATL项目 打开VS2008,建立一个ATL项目,如下图: 考虑到简介性,选择了"Allow merging of proxy/stub code" 添加ATL控件 (建议先编译一下真个project

Android开发四大组件之Service(实例篇)

关于Service的开发详解已经在上一篇:Android开发四大组件之Service(详解篇)讲的很清楚了,本篇主要对Service的开发实例做下讲解. 程序运行效果图: 程序代码: BindService: package com.jph.servicedemo; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; /**

iOS开发之组件化架构漫谈

前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目.在重构项目之前涉及到架构选型的问题,我和组里小伙伴一起研究了一下组件化架构,打算将项目重构为组件化架构.当然不是直接拿来照搬,还是要根据公司具体的业务需求设计架构. 在学习组件化架构的过程中,从很多高质量的博客中学到不少东西,例如蘑菇街李忠.casatwy.bang的博客.在学习过程中也遇到一些问题,在微博和QQ上和一些做iOS的朋友进行了交流,非常感谢这些朋友的帮助. 本篇文章主要针对于之前蘑菇街提出的组件化方案,以及cas

使用低版本的VS打开高版本项目的解决方案(以VS2008打开VS2010开发的项目为例)

使用低版本的VS打开高版本项目的解决方案,这里以VS2008打开VS2010开发的项目为例. 右键项目的sln文件以记事本的方式打开: 将对应的前两列版本各降到对应的版本,这边的11.00改为10.00,2010改为2008: 然后使用2008版本打开该sln文件,重新生成项目就OK了. 若是vs2013在vs2010中打开,可以参考此篇文章:如何将VS2013的项目在VS2010中打开(Visual Studio降级打开项目) 本文来自木庄博客>使用低版本的VS打开高版本项目的解决方案(以VS

个帖子学会Android开发四大组件

黑色幽默Lion 方向比努力重要,能力比知识重要,情商比智商重要! 首页 新闻 新随笔 管理 随笔- 43  文章- 0  评论- 12 一个帖子学会Android开发四大组件 注:本文来自"友盟杯",仅在此阅读,学习 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重要组件 intent的详解. 一.Activity详解Activty的

[activeX]使用ATL开发ActiveX控件[转]

本文描述了使用ATL开发一个ActiveX控件的完整过程. 一.创建项目 单击起始页中的"New Project-",选择"ATL"分类下的"ATL Project"项目,项目名称为"Calculator".在随后出现的项目向导中,使用默认配置即可. 二.添加控件 在解决方案管理器中的项目上右击,依次选择"Add"."Class",在添加类对话框中选择ATL分类下的ATL Control

Android开发四大组件--Activity详解

Android开发四大组件--Activity详解 - Android开发教程 Android开发的四大组件在开发中应用中是必不可少的,下面就来详解下四大组件之一Activity,总结自网络.Activty的生命周期的也就是它所在进程的生命周期. 一个Activity的启动顺序: onCreate()——>onStart()——>onResume() 当另一个Activity启动时: 第一个Activity onPause()——>第二个Activity onCreate()——>

C# 开发COM组件供c++使用

C# 开发COM组件供c++使用 Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用以及.NET如何调用SDK中的Windows库函数. 本文在学习网上资料的基础上,实现用C#开发组件供C++使用的过程. 编程环境:vs2015 (COM组件) vs2005 c++调用 操作系统 win10 一.C#COM组件 1.新建一个C#类库项目:ExcelCom  (原计划做一个EXCEL

ATL实现一个组件多个dual接口,multidisp

最近想自己写个按键精灵的插件,于是接触到这个问题: 怎么在一个组件里实现两个自动化接口. 主要针对的ATL,MFC貌似没这个问题,具体MFC是怎么实现的自己没有深究. 按键精灵的插件会在一个组件里实现两个dispinterface,具体请看oleview工具截图: 刚开始对这个问题不理解,以为不是问题,自己用ATL尝试了几次,才发现不是那么回事,于是google之. MSDN上是这么说的,看这里 ATL不提供任何为将多个双重接口支持.IDispatch的单个实现. 但是,有几个已知的方法来手动合