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通信的方法寫入進去。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章