atl com元件調用
- 需要先建立一個
工程atl 簡單對象
- 需要建立一個
com類
- 需要在
中加入一個com接口
方法add
- 編譯通過後我們可以建立一些
調用demo
- 使用 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 ;
}
- 還可以是 使用下面的方法
// 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 ;
}
- 使用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元件中包括兩個或者以上的接口時,調用程式怎樣寫
- 在
程式中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 ;
}
- 在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接收器,調用事件
- 建立一個win32 控制台程式,其中需要atl支援
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 構造函數将是顯式的
#include <atlbase.h>
#include <atlstr.h>
- 在程式中我們主要是繼承
模闆類具體實作可以看以下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 ;
}