ATL写接口使用简单案例

最近在学习简单的组件和接口的编写

1. 首先编写idl文件,用来编译生成一个.h和两个.c的文件,这个文件的作用是定义了接口和组件的名称和声明了方法。代码如下

import "oaidl.idl";
import "ocidl.idl";

[
	object,
	uuid(D83E1F89-7306-46c0-A117-15B8BF9874F0)
]

interface IMath : IUnknown
{
	HRESULT PostMessageEx(long Add1,long Add2,long *pnAdd);
	HRESULT SendMessageEx(long Sub1,long Sub2,long *pnSub);
}

[
	uuid(D76E3835-D743-4241-B80E-054B041E15E8)
]

coclass ComObj
{
	interface IMath;
}
2.添加一个类,随便写个类型,这个类要导入刚才生成的头文件,并且这个类里面定义了接口的方法

#pragma once

#include "atlbase.h"
extern CComModule _Module;
#include "atlcom.h"

#include "interface_idl_h.h"

class CMath : public CComObjectRootEx <CComMultiThreadModel>,
			  public IMath
{		
public:
	CMath(void);
	virtual ~CMath(void);
public:
	BEGIN_COM_MAP(CMath)
		COM_INTERFACE_ENTRY(IMath)
	END_COM_MAP()
public:
	STDMETHOD(PostMessageEx)(long Add1,long Add2,long *pnAdd);
	STDMETHOD(SendMessageEx)(long Sub1,long Sub2,long *pnSub);
};

然后是.cpp文件,来实现方法的

#include "StdAfx.h"
#include "Math.h"

CComModule _Module;

CMath::CMath(void)
{
}

CMath::~CMath(void)
{
}


STDMETHODIMP CMath :: PostMessageEx(long Add1,long Add2,long *pnAdd)
{
	*pnAdd = Add1 + Add2 ;
	return S_OK;
}

STDMETHODIMP CMath :: SendMessageEx(long Sub1,long Sub2,long *pnSub)
{
	*pnSub = Sub2 - Sub1 ;
	return S_OK;
}

最后是写导出表,之前因为这个导出表忘记写,老是GetProcAddress不到dll中函数的入口地址,蛋疼的一塌糊涂,这个一定不能写丢了

LIBRARY	"ATL_Com"
	EXPORTS
		MyCreateInstance @1

好了,组件和接口已经搞定了,后面就是应用了


建立一个控制台程序,然后进行一系列的调用,基本思路是这个样子的

1.先使用LoadLibrary将Dll的句柄获取到

2.然后使用GetProcAddress将dll中的函数的入口地址获得到

3.然后利用IUnknown接口和之前自己定义的接口ID,利用QueryInterface函数获得到想要获得的接口地址

然后就可以随心所欲的调用了,代码如下

#include "stdafx.h"
#include "objbase.h"
#include "../ATL_Com/interface_idl_h.h"
#include "../ATL_Com/interface_idl_i.c"


typedef IUnknown * (* MYCREATEINSTANCE)();

IMath * GetMath()
{
	HMODULE h_Dll = (HMODULE )LoadLibrary(L"ATL_Com.dll");
	MYCREATEINSTANCE MyCreate = (MYCREATEINSTANCE)GetProcAddress(h_Dll,"MyCreateInstance");
	IUnknown * piUnknow = MyCreate();
	IMath * piMath = NULL;
	piUnknow->QueryInterface(IID_IMath,(LPVOID *)&piMath);
	piUnknow->Release();
	return piMath;
}


int _tmain(int argc, _TCHAR* argv[])
{
	IMath * piMath = GetMath();
	long Sum = 0;
	piMath->PostMessageEx(100,100,&Sum);
	wprintf(L"%d\n",Sum);
	return 0;
}

基本的小架构差不多就是这样,大的东西也是从小的东西慢慢展开的嘛,后面准备把RPC通信的方法写入进去。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值