C++“隐藏实现,开放接口”的实现方案
作者:luoweifu 发布时间:[ 2016/11/4 10:50:15 ] 推荐标签:测试开发技术 C++
提供C接口
从上面的代码我们可以看到IPage可以由IDocument创建,ITextUnit可以由IPage创建。那问题来了,IDocument由谁来创建呢?这时我们可以提供两个全局的函数CreateDoc和DestroyDoc用来创建和销毁IDocument的对象指针,这两个函数是全局函数(C类型的函数),我们需要为其提供C的导出接口(这很重要)。其接口定义如下:
#pragma once
#include "IDocument.h"
#include "IPage.h"
#include "ITextUnit.h"
//===============================================================
//要导出静态库时,导出库的工程要加预编译宏STATIC_LIBRARY,使用库的工程什么也要加STATIC_LIBRARY宏
//要导出动态库时,导出库的工程要加预编译宏EXPORT,使用库的工程什么也不用加
//===============================================================
#ifdef EXPORT //导出库
#define _API_ __declspec(dllexport)
#else //导入库
#define _API_ __declspec(dllimport)
#endif //EXPORT
#ifdef STATIC_LIBRARY //导出静态库
#define EBAPI int
#else //导出动态库
#define EBAPI extern "C" _API_ int
#endif //STATIC_LIBRARY
//---------------------------------------------------------------
//function:
// CreateDoc 创建Document对象
//Access:
// public
//Parameter:
// [in] IDocument * & pDocument -
//Returns:
// EBAPI -
//Remarks:
// ...
//author: luowf[/luoweifu]
//---------------------------------------------------------------
EBAPI CreateDoc(IDocument*& pDocument);
//---------------------------------------------------------------
//function:
// DestroyDoc 销毁一个Document对象
//Access:
// public
//Parameter:
// [in] IDocument * pDocument -
//Returns:
// EBAPI -
//Remarks:
// ...
//author: luowf[/luoweifu]
//---------------------------------------------------------------
EBAPI DestroyDoc(IDocument* pDocument);
使用库
我们可以将EBook编译成一个静态库,然后再创建一个新的工程使用它。EBook工程设置:

图3: 工程配置(说明:上图中红色框中的EXPORT_STATIC已重命名为STATIC_LIBRARY的)
创建一个新的工程UseEBook使用EBook库。UseEBook工程配制:
Generation PropertiesC++PreprocessPreprocess Definitions:STATIC_LIBRARY
Generation PropertiesLinkerGeneralAddtional Library Directories:lib库所在路径
Generation PropertiesLinkerInputAddtional Dependencies:EBook.lib
测试代码:
#include "stdafx.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
IDocument* pDoc = NULL;
if(CreateDoc(pDoc) != 0)
{
return -1;
}
IPage* pPage = pDoc->AddPage();
ITextUnit* pTextUnit = pPage->AddTextUnit();
std::cout << pTextUnit->GetId() << std::endl;
DestroyDoc(pDoc);
return 0;
}

sales@spasvo.com