首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络安全-> 安全在线
MFC DLL向导(二)-.NET教程,评论及其它
作者:网友供稿 点击:37
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
使用dll的一个比较严重的问题就是编译器之间的兼容性问题。不同的编译器对c++函数在二进制级别的实现方式是不同的。所以对基于c++的dll,如果编译器不同就有很麻烦的。如果创建的是mfc扩展dll,就不会存在问题,因为它只能被动态连接到mfc的客户应用程序。这里不是本文讨论的重点。

一、重新编译问题
我们先来看一个在实际中可能遇到的问题:
    比如现在建立好了一个dll导出了cmyclass类,客户也能正常使用这个dll,假设cmyclass对象的大小为30字节。如果我们需要修改dll中的cmyclass类,让它有相同的函数和成员变量,但是给增加了一个私有的成员变量int类型,现在cmyclass对象的大小就是34字节了。当直接把这个新的dll给客户使用替换掉原来30字节大小的dll,客户应用程序期望的是30字节大小的对象,而现在却变成了一个34字节大小的对象,糟糕,客户程序出错了。
    类似的问题,如果不是导出cmyclass类,而在导出的函数中使用了cmyclass,改变对象的大小仍然会有问题的。这个时候修改这个问题的唯一办法就是替换客户程序中的cmyclass的头文件,全部重新编译整个应用程序,让客户程序使用大小为34字节的对象。
    这就是一个严重的问题,有的时候如果没有客户程序的源代码,那么我们就不能使用这个新的dll了。

二、解决方法  
 为了能避免重新编译客户程序,这里介绍两个方法:(1)使用接口类。(2)使用创建和销毁类的静态函数。
1、使用接口类
   接口类的也就是创建第二个类,它作为要导出类的接口,所以在导出类改变时,也不需要重新编译客户程序,因为接口类没有发生变化。
   假设导出的cmyclass类有两个函数functiona functionb。现在创建一个接口类cmyinterface,下面就是在dll中的cmyinterface类的头文件的代码:
# include "myclass.h"
class _declspec(dllexport) cmyinterface
{
     cmyclass *pmyclass;
     cmyinterface();
     ~cmyinterface();
  public:
     int functiona(int);
     int functionb(int);
};
而在客户程序中的头文件稍不同,不需要include语句,因为客户程序没有它的拷贝。相反,使用一个cmyclass的向前声明,即使没有头文件也能编译:
class _declspec(dllexport) cmyinterface
{
     class cmyclass;//向前声明
     cmyclass *pmyclass;
     cmyinterface();
     ~cmyinterface();
  public:
     int functiona(int);
     int functionb(int);
};
在dll中的cmyinterface的实现如下:
cmyinterface::cmyinterface()
{
      pmyclass = new cmyclass();
}
cmyinterface::~cmyinterface()
{
     delete pmyclass;
}
int cmyinterface::functiona()
{
     return pmyclass->functiona();
}
int cmyinterface::functionb()
{
     return pmyclass->functionb();   
}
.....
对导出类cmyclass的每个成员函数,cmyinterface类都提供自己的对应的函数。客户程序与cmyclass没有联系,这样任意改cmyclass也不会有问题,因为cmyinterface类的大小没有发生变化。即使为了能访问cmyclass中的新增变量而给cmyinterface类加了函数也不会有问题的。
   但是这种方法也存在明显的问题,对导出类的每个函数和成员变量都要对应实现,有的时候这个接口类会很庞大。同时增加了客户程序调用所需要的时间。增加了程序的开销。

2、使用静态函数
   还可以使用静态函数来创建和销毁类对象。创建一个导出类的时候,增加两个静态的公有函数createme()/destroyme(),头文件如下:
class _declspec(dllexport) cmyclass
{
     cmyclass();
     ~cmyclass();
  public:
     static cmyclass *createme();
     static void destroyme(cmyclass *ptr);
};
实现函数就是:
cmyclass * cmyclass::cmyclass()
{
      return new cmyclass;
}
void cmyclass::destroyme(cmyclass *ptr)
{
      delete ptr;
}
然后象其他类一样导出cmyclass类,这个时候在客户程序中使用这个类的方法稍有不同了。如若想创建一个cmyclass对象,就应该是:
cmyclass x;
cmyclass *ptr = cmyclass::createme();
在使用完后删除:
cmyclass::destroyme(ptr);


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·在C#中使用代理的方式触发事件-.NET教程,C#语言
·Java socket编程入门[1]-JSP教程,Java技巧及代码
·VB.NET 操作 ACCESS OLE 字段内容-.NET教程,VB.Net语言
·实例学习Spring和Hibernate的一点点体会-JSP教程,资料/其它
·《XML指南》下载[CHM格式-.NET教程,XML应用
·锂离子动力电池待解决的使用技术问题
·ASP.NET下的Page Controller以及Template Method-.NET教程,Asp.Net开发
·用C#实现WEB浏览器-.NET教程,C#语言
·在Visual Studio 2005和ASP.NET 2.0中使用强类型数据存取-.NET教程,Asp.Net开发
·ASP和C#隐藏文件下载路径的方法-ASP教程,ASP技巧
最新文章
·论arp攻击防制的基本方法_安全在线教程
·七种最不安全的网络管理员_安全在线教程
·windows网络安全其实我们只差五步_安全在线教程
·确保无线网络安全实施的几种技术规范_安全在线教程
·从两大方面阻止域名劫持_安全在线教程
·对网站做一些简单的seo处理_seo网站优化
·如何减轻ddos攻击危害_安全在线教程
·防火墙封阻应用攻击的八项技术_安全在线教程
·防火墙的来历及应用现状_安全在线教程
·浅析ids与ips共生与发展_安全在线教程
相关主题
  • MFC DLL向导(一)-.NET教程,评论及其它
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭