DLL导出接口累,避免修改后重新编译

来源:互联网 发布:java lucene 全文检索 编辑:程序博客网 时间:2024/05/20 16:09
 如果你的.DLL导出类或者类的实例,你不得不在修改了.DLL后重新编译你的客户端.为了避免这样,你必须做到分解你要导出的类,实现导出类的一个接口.最好的方法是,创建一个作为第一个类的接口的类,这样你改变了导出类的话,接口类不变,客户程序无需重新编译.
  这里有一个例子.假设你要导出CMyClass类.CMyClass有两个公有函数,int FunctionA(int)和int FunctionB(int).替代导出CMyClass,我将创建一个导出接口CMyInterface.CMyInterface将含有一个指向CMyClass的实例.这里给出它的头文件:
  
     class AFX_EXT_CLASS CMyInterface
     {
          class CMyClass; //forward declaration of CMyClass
          CMyClass *m_pMyClass;
          
          public:
          CMyInterface( );
          ~CMyInterface( );
          
          int FunctionA(int);
          int FunctionB(int);
     };

  这份头文件将用在.DLL和客户端程序.注意,前面的声明意味着没有CMyClass的备份也可以编译.
  在.DLL内部,这样实现CMyInterface:

     CMyInterface::CMyInterface( )
     {
          m_pMyClass = new CMyClass;
     }
    
     ~CMyInterface::~CMyInterface( )
     {
          delete m_pMyClass;
     }
    
     CMyInterface::FunctionA( )
     {
          return m_pMyClass->FunctionA( );
     }
    
     CMyInterface::FunctionB( )
     {
          return m_pMyClass->FunctionB( );
     }

  因此,CMyClass的每一个函数,CMyInterface将提供相应的函数.客户程序将和客户程序没有联系.如果它想调用CMyClass::FunctionA,只需调用CMyInterface::FunctionA.接口类会用指针调用CMyClass.用这种布局你可以改变CMyClass了----不用担心CMyClass的大小变了.CMyInterface的接口的大小不变.即使你给CMyClass加了一个私有变量,CMyInterface的大小也不会变.要是你加了公有成员,就在CMyInterface里边直接加上对应新变量的"getter" 和 "setter" 函数,不用担心,加入新的函数,CMyInterface接口类的大小不会改变.
  建立一个单独的接口可以避免编译器不兼容,客户端重编译的问题.只要接口类不变,就不需重编译.但仍然有两个小问题,一:对于每一个CMyClass的公有的成员变量,你必须在CMyInterface里创建实际的对应的函数或变量.这个例子中只有两个函数,所以很简单.如果CMyClass有成千上万的函数和变量,这将变得很困难,而且易错.二:你将增大进程的开销.客户程序不再直接访问CMyClass,替代的通过访问CMyInterface来访问CMyClass.如果一个函数要被调用成千次,那此进程将会耗用很长时间.

原创粉丝点击