简单接口实现规范

发布时间 : 星期三 文章简单接口实现规范更新完毕开始阅读

}

if (m_piA) {delete m_piA; if (m_piB) {delete m_piB; delete this;

m_piA = 0;} m_piB = 0;}

virtual void Create() { }

m_piA = new(int); assert(m_piA); m_piB = new(int); assert(m_piB);

virtual void Cal() { }

assert(m_piA); assert(m_piB); int c;

c = *m_piA + *m_piB;

private: };

void LibCreate(IDestruction** ppInterface) {

CDestruction *pCDes; pCDes = new CDestruction();

第13页 共68页

int *m_piA, *m_piB;

}

assert(pCDes); pCDes->Create();

*ppInterface = (IDestruction*) pCDes;

int main(int argc, char* argv[]) { }

IDestruction *pInterface; LibCreate(&pInterface); pInterface->Release(); // delete pInterface; return 0;

第14页 共68页

第四节 关于__stdcall和__cdecl 一、 说明

接口是基于虚拟函数的,所以对于函数的理解必须保证大家一致,这主要关系到下面几

个问题。

? 函数的参数的传入次序 ? 函数的参数的压栈出栈管理 ? 变长参数的使用

在VC环境里,主要有两类调用模式,即__stdcall和__cdecl,对这两种调用模式的区别,

详细看参看MSDN之URL:

mk:@MSITStore:C:\\Program Files\\Microsoft Visual Studio\\MSDN\\2001JUL\\1033\\vccore.chm::/html/_core_calling_conventions.3a_.overview.htm

二、 显式地说明接口的调用方式

所以为了避免对接口理解的不一致性,需要显式地说明接口的调用方式。 例如: class IFoo { }

VC缺省情况下,使用__cdecl。而在COM中,我们一般发现定义接口函数如下: STDMETHOD(Start)();

其实:STDMETHOD定义如下:

#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method 而STDMETHODCALLTYPE定义如下: #ifdef _68K_

#define STDMETHODCALLTYPE __cdecl #else

第15页 共68页

void __cdecl DeleteName(…);

#define STDMETHODCALLTYPE __stdcall #endif

这说明,COM为了保证接口的无歧义性,显式地定义了其接口函数。 因此,我们的简单接口规范也要求这样做。 有两类函数需要使用这个定义: ? 简单接口的虚表函数(即接口) ? DLL的输出函数或Lib库的全局函数

第五节 辅助类Helper和Factory:帮您创建接口 一、 接口的辅助类:helper类

1、 概念

一般一个接口对应一个helper类, 帮助创建和维护一个接口对象,免除加载、释放dll、查找和执行输出函数、版本管理之苦,只要申明一个CIFooHelper变量并执行CIFooHelper.Create()即可轻松获取接口对象。

helper类一般提供两个方法Create()和Close()来管理接口对象。 CIFooHelper.Create()或LibCreate()创建接口对象步骤如下: ? 如果是Create()创建:

1、 通过LoadLibrary()查找并加载接口所在的dll 2、 在dll中查找接口的创建函数

3、 调用接口的创建函数,获得接口对象指针 4、 ok

? 如果是LibCreate()创建:

CIFooHelper.Close()销毁接口对象如下: 1、 直接调用接口对象的Release()函数

第16页 共68页

联系合同范文客服:xxxxx#qq.com(#替换为@)