DLL导出接口累,避免修改后重新编译
2011-07-19 20:10
190 查看
如果你的.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.如果一个函数要被调用成千次,那此进程将会耗用很长时间.
这里有一个例子.假设你要导出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.如果一个函数要被调用成千次,那此进程将会耗用很长时间.
相关文章推荐
- unity 安卓热更新代码的最新方法: 通过Mono加载新的重新编译的dll
- VS2010中如何查看DLL的导出接口
- 反编译C#的dll文件并修改,再重新生成dll
- 删除可视图中的类不能彻底避免它重新被编译
- C++ DLL导出接口
- vs 项目编译运行报错:无法启动此程序,因为计算机中丢失 osg130-osgDB.dll。尝试重新安装该程序以解决此问题
- .net dll或者exe避免被反编译的方法
- Unity3d 反编译破解游戏 简单示例 (使用ildasm反编译DLL修改然后重新编译DLL)
- 利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用
- VS2010中如何查看DLL的导出接口
- 避免不必要的JSP重新编译
- 导出DLLRegisterServer接口遇到的问题
- 利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用
- Unity3D-重新编译Mono加密DLL
- BCB(C++ Builder)创建动态库(DLL,接口导出和调用),动态加载DLL
- 用了.net2.0,再用1.1的问题。1.1里修改.cs文件不重新编译,.dll不重新生成。
- VS2010中如何查看DLL的导出接口
- C++编译时函数名修饰约定规则和DLL中导出函数的方法
- dll重新编译问题解决方案
- 将session存入数据库的方法(摘自“漂泊雪狼”--在asp.net程序开发中避免编译就要重新登录系统的小技巧 )