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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值