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(1,6);
cout<<ret<<endl;
pIMyCal.Release();
CoUninitialize();
system("pause");
return 0;
}
- 还可以是 使用下面的方法
// 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;
}
- 使用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组件中包括两个或者以上的接口时,调用程序怎样写
- 在
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;
}
- 在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接收器,调用事件
- 创建一个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,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;
}