提供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;
}