最近在学习简单的组件和接口的编写
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通信的方法写入进去。