天天看點

atl com元件調用atl com元件調用更新4月27日

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(,);
    cout<<ret<<endl;
    pIMyCal.Release();
    CoUninitialize();
    system("pause");
    return ;
}
           
  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(,,&sum);
            cout<<sum<<endl;
            pMyCal->Release();
        }
    }

    CoUninitialize();
    system("pause");
    return ;
}
           
  1. 使用wpf 的c# 使用com
private void button1_Click(object sender, RoutedEventArgs e)
        {
            atlDrawLib.MyCal myTest = new MyCal();
            int sum=myTest.add(, );
            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(,);
    pIAd->ShowAd(OLESTR(""));
    cout<<ret<<endl;
    pIMyCal.Release();
    pIAd.Release();
    CoUninitialize();
    system("pause");
    return ;
}
           
  1. 在c#中調用
private void button1_Click(object sender, RoutedEventArgs e)
        {
            atlDrawLib.MyCal myTest = new MyCal();
            int sum=myTest.add(, );
            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,,{VT_I4}};
class CEvent :public IDispEventSimpleImpl<,CEvent,&__uuidof(_ISunnyEvent)>
{
public:
    CEvent(){};
    virtual ~CEvent(){};
    BEGIN_SINK_MAP(CEvent)
        SINK_ENTRY_INFO(,__uuidof(_ISunnyEvent),,OnChange,&FunInfo)
    END_SINK_MAP()
public:
    STDMETHOD(OnChange)(long x)
    {
        cout<<x<<endl;
        return ;
    };
};

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();   
    hr=event.DispEventUnadvise(pIMyCal);
    pIMyCal.Release();
    pIAd.Release(); 
    system("pause");
    return ;
}