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.如果一个函数要被调用成千次,那此进程将会耗用很长时间.
这里有一个例子.假设你要导出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.如果一个函数要被调用成千次,那此进程将会耗用很长时间.
- DLL导出接口累,避免修改后重新编译
- C#中修改Dll文件 (反编译后重新编译)
- [delphi]修改indy源码后重新编译
- 如何修改被编译后DLL文件
- 修改smali文件重新编译后出现 java.lang.VerifyError:
- caffe部分配置修改后,重新编译caffe的教程
- Unity外部加载文本数据——避免修改部分数据重新导出包
- Unity3d 反编译破解游戏 简单示例 (使用ildasm反编译DLL修改然后重新编译DLL)
- Unity3d 反编译破解游戏 简单示例 (使用ildasm反编译DLL修改然后重新编译DLL)
- DLL接口的导出
- DLL接口的导出
- dll导出接口
- 如何修改被编译后DLL文件(入门)
- Reflector+Reflexil 修改编译后的C# dll 文件
- dll重新编译问题解决方案
- 重新编译Assembly-CSharp.dll
- 关于vs编译后bin下的dll文件重新出现的问题
- 避免不必要的JSP重新编译
- jsp页面上,限制文本框里的输入值类型为数字
- 在android中处理各种触摸事件
- 为美国GAAP分类标准补充业务规则正当时 - Charles Hoffman博客
- 2、设计包含min 函数的栈
- Oracle10安装
- DLL导出接口累,避免修改后重新编译
- SIP 简介
- sizeof 内存对齐
- OpenGL与MFC编程思想
- SIP 消息
- 自己需要的网站
- dojo 模态框 修改模态框的属性
- 常用的PL/SQL开发原则 by dbsanke
- SIP消息源路由