atl com组件调用

atl com组件调用

  1. 需要先创建一个atl 简单对象工程
  2. 需要创建一个com类
  3. 需要在com接口中加入一个add方法
  4. 编译通过后我们可以创建一些调用demo
  5. 使用 c++ win32程序调用实例1
// altDrawTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include  <iostream>
#include <Windows.h>
#import "../../atlDraw/Debug/atlDraw.dll" no_namespace
#include <atlcomcli.h>//CComPtr需要使用
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    hr=CoInitialize(NULL);
    CLSID clsid;
    CLSIDFromProgID(OLESTR("Sunny.MyCal.1"),&clsid);//prog.id为Sunny.MyCal.1
    CComPtr<IMyCal> pIMyCal;
    pIMyCal.CoCreateInstance(clsid);
    long ret=pIMyCal->add(1,6);
    cout<<ret<<endl;
    pIMyCal.Release();
    CoUninitialize();
    system("pause");
    return 0;
}
  1. 还可以是 使用下面的方法
   // altDrawTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include  <iostream>
#include <Windows.h>
//#include "../atlDraw/atlDraw_i.c"
//#include "../atlDraw/atlDraw_i.h"

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    hr=CoInitialize(NULL);
    IMyCal *pMyCal=NULL;
    if (SUCCEEDED(hr))
    {                
        hr=CoCreateInstance(CLSID_MyCal,NULL,CLSCTX_INPROC_SERVER,IID_IMyCal,(void **)&pMyCal);
        if (SUCCEEDED(hr))
        {
            long sum;
            pMyCal->add(1,5,&sum);
            cout<<sum<<endl;
            pMyCal->Release();
        }
    }

    CoUninitialize();
    system("pause");
    return 0;
}
  1. 使用wpf 的c# 使用com
 private void button1_Click(object sender, RoutedEventArgs e)
        {
            atlDrawLib.MyCal myTest = new MyCal();
            int sum=myTest.add(1, 3);
            MessageBox.Show(sum.ToString());
        }

15年-4月-24日更新
当在com组件中包括两个或者以上的接口时,调用程序怎样写

  1. c++ 程序中
#include "stdafx.h"
#include  <iostream>
#include <Windows.h>
//#include "../atlDraw/atlDraw_i.c"
//#include "../atlDraw/atlDraw_i.h"
#import "../../atlDraw/Debug/atlDraw.dll" no_namespace
#include <atlcomcli.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    hr=CoInitialize(NULL);
    CLSID clsid;
    CLSIDFromProgID(OLESTR("Sunny.MyCal.1"),&clsid);
    CComPtr<IMyCal> pIMyCal;
    CComPtr<IAdvertiseMyself> pIAd;
    pIMyCal.CoCreateInstance(clsid);
    pIAd.CoCreateInstance(clsid);//这里是关键点
    long ret=pIMyCal->add(1,6);
    pIAd->ShowAd(OLESTR(""));
    cout<<ret<<endl;
    pIMyCal.Release();
    pIAd.Release();
    CoUninitialize();
    system("pause");
    return 0;
}
  1. 在c#中调用
 private void button1_Click(object sender, RoutedEventArgs e)
        {
            atlDrawLib.MyCal myTest = new MyCal();
            int sum=myTest.add(1, 3);
            IAdvertiseMyself hh = (IAdvertiseMyself)myTest;//这个强制转换时关键
            hh.ShowAd("你好");
            MessageBox.Show(sum.ToString());
        }

更新4月27日

主要实现c++ sink接收器,调用事件

  1. 创建一个win32 控制台程序,其中需要atl支持
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

#include <atlbase.h>
#include <atlstr.h>
  1. 在程序中我们主要是继承IDispEventSimpleImpl模板类具体实现可以看以下
// atlDrawTest2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <atlcom.h>
#import "../../atlDraw/Debug/atlDraw.dll" no_namespace


using namespace std;
static _ATL_FUNC_INFO FunInfo={CC_STDCALL,VT_EMPTY,1,{VT_I4}};
class CEvent :public IDispEventSimpleImpl<1,CEvent,&__uuidof(_ISunnyEvent)>
{
public:
    CEvent(){};
    virtual ~CEvent(){};
    BEGIN_SINK_MAP(CEvent)
        SINK_ENTRY_INFO(1,__uuidof(_ISunnyEvent),0x01,OnChange,&FunInfo)
    END_SINK_MAP()
public:
    STDMETHOD(OnChange)(long x)
    {
        cout<<x<<endl;
        return 0;
    };
};

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    hr=CoInitialize(NULL);
    CLSID clsid;
    CLSIDFromProgID(OLESTR("Sunny.MyCal.1"),&clsid);
    CComPtr<IMyCal> pIMyCal;
    CComPtr<IAdvertiseMyself> pIAd;
    pIMyCal.CoCreateInstance(clsid);
    CEvent event;
    hr=event.DispEventAdvise(pIMyCal);
    pIAd.CoCreateInstance(clsid);   
    pIMyCal->PutDigit(5);   
    hr=event.DispEventUnadvise(pIMyCal);
    pIMyCal.Release();
    pIAd.Release(); 
    system("pause");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值