本文共 3660 字,大约阅读时间需要 12 分钟。
接口描述语言(Interface description language,缩写IDL)
c++写的接口,只能c++和c识别,为了接口的通用性,让所有的语言都通用的定义使用接口引入IDL,使用IDL定义接口以后,用MIDL编译为c++可用的接口定义
按照COM规范定义的接口,即为COM接口
import "oaidl.idl";import "ocidl.idl";import "objidl.idl";[ object, uuid(CFF0849D-61E2-4ED1-9DC9-0E43E2FBDE25)]interface IMath :IUnknown{ HRESULT Add(long nAdd1, long nAdd2, long* pnAdd) = 0; HRESULT Sub(long nSub1, long nSub2, long* pnSub) = 0;};[ uuid(39B16755-783D-49B1-93E2-0FCA9F66CC2D)]coclass Math{ interface IMath;};
#pragma once#include "math_h.h"class ClmpMath:public IMath{public: ClmpMath(); ~ClmpMath();//IUnKnuwnpublic: STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppiObject); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)();//IMathpublic: STDMETHOD(Add)(long nAdd1, long nAdd2, long* pnAdd); STDMETHOD(Sub)(long nSub1, long nSub2, long* pnSub);//public: LONG m_nRef;};
#include "stdafx.h"#include "ClmpMath.h"ClmpMath::ClmpMath(){ m_nRef = 0;}ClmpMath::~ClmpMath(){}STDMETHODIMP ClmpMath::QueryInterface( REFIID iid, LPVOID* ppiObject){ if (iid == IID_IUnknown) { *ppiObject = static_cast(this); } else if (iid == IID_IMath) { *ppiObject = static_cast (this); } else { *ppiObject = NULL; return E_NOINTERFACE; } AddRef(); return S_OK;}STDMETHODIMP_(ULONG)ClmpMath:: AddRef(){ InterlockedIncrement(&m_nRef); return m_nRef;}STDMETHODIMP_(ULONG)ClmpMath::Release(){ InterlockedDecrement(&m_nRef); if (m_nRef == 0) { delete this; } return m_nRef;}STDMETHODIMP ClmpMath::Add( long nAdd1, long nAdd2, long* pnAdd){ if (pnAdd == NULL) { return E_POINTER; } *pnAdd = nAdd1 + nAdd2; return S_OK;}STDMETHODIMP ClmpMath::Sub( long nSub1, long nSub2, long* pnSub){ if (pnSub == NULL) { return E_POINTER; } *pnSub = nSub1 + nSub2; return S_OK;}
IUnknown* CreateInstanceEx(CLSID clsid){//判断组件的CLSID if (clsid == CLSID_Math) { //创建对象 ClmpMath* pMath = new ClmpMath; //获取接口 IUnknown* piUnknown = NULL; pMath->QueryInterface(IID_IUnknown, (LPVOID*)&piUnknown); //返回接口 return piUnknown; } return FALSE;}
转载地址:http://nzxui.baihongyu.com/