永无止境

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿(1)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2010年4月 (1)
  • 2009年10月 (1)
  • 2009年1月 (2)

搜索

  •  

最新评论

阅读排行榜

  • 1. CString如何转成int(1464)
  • 2. Dll中的类如何动态加载(882)
  • 3. VS2005断点不能用的问题(574)
  • 4. c++为何要用虚表(494)

评论排行榜

  • 1. CString如何转成int(0)
  • 2. VS2005断点不能用的问题(0)
  • 3. c++为何要用虚表(0)
  • 4. Dll中的类如何动态加载(0)

Powered by: 博客园
模板提供:沪江博客
C++博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

2010年4月22日

Dll中的类如何动态加载

在使用不同版本编译环境合作开发的时侯,如果采用原代码级的合作,低版本的编译器有可能因为缺少必需的头文件而无法通过编译。这时可以将高版本VS开发的类编译成DLL导出类,给低版本VS使用者调用。
但是在DLL中导出的类是无法通过动态加载的方式进行使用的,必须在编译时将.LIB文件链接进去。类的成员函数无法单独导出。
用GetProcessAddress函数只能导出普通函数,但可以在普通函数中使用DLL中的类和它的方法,因此可以用普通函数将类的公有方法进行包装,然后进行导出,这样就可以用动态加载的方法使用DLL中的类的功能了。
posted @ 2010-04-22 13:28 无尘 阅读(882) | 评论 (0) | 编辑 收藏
 

2009年10月5日

c++为何要用虚表
让我们来对比一下没有虚函数的C++类和有虚函数的C++类有什么不同吧,
没有虚函数的类变量指针的类型是已知的,尽管该指针所指向的对象并不确定,但这不会影响对于类方法的定位,因为方法在代码段中,只要类型确定了,方法的地址也就确定了,这与具体对象的地址无关。这样一来,由于类变量的类型是确定的,所以在编译的时侯就可以确定类变量的方法的调用地址。
而在有虚函数的情况下情况就比较复杂了,这时为了实现多态,类变量指针可能是一个父类指针,而这个指针到底指向哪个子类对象还不知道,也就是指针的真实类型还不确定,所以也无法确定将要调用的类方法的真实地址,也就无法在编译时刻给出被调用类方法的地址,为了让这个父类指针正确的执行它指向的子类的方法,这时虚表就派上用场了,虚表存在于具体的子类对象中,用于保存虚函数的真实地址,在虚表中,各个虚函数的排列顺序是一定的,虚表在具体对象中的偏移量也是一定的,对象的地址就是虚表的地址,于是虚表地址+4h肯定是方法A的地址这个对应关系永远不会变化,而虚表中保存的方法A的地址却随着具体类型的变化而变化,这个子类方法A的地址是在对象NEW的时侯填写进去的,这样就把不同子类中变化的方法地址转化成了不变的虚表地址,在编译的时刻只要把调用地址写成这个不变的虚表地址的内容所指向的地址,就完成了对虚函数的调用。
posted @ 2009-10-05 02:21 无尘 阅读(494) | 评论 (0) | 编辑 收藏
 

2009年1月13日

VS2005断点不能用的问题
提示“当前不会命中断点。源代码与原始版本不同”,

解决办法,"编辑","高级","设置选定内容的格式","将制表符替换成空格"
posted @ 2009-01-13 17:15 无尘 阅读(574) | 评论 (0) | 编辑 收藏
 

2009年1月6日

CString如何转成int
网上的介绍都是用atoi函数,但是CString 内部存储的是wchar_t 类型的字符,每个字符占两个字节,atoi的参数是char*,每个字符占一个字节 ,如果强制转换成char*,由于高位字节是空,所以就转成了只有第一个字符的串,这样是不对的.应该用_wtoi函数,这个函数的参数是wchar_t*,示例如下:
CString str("123");
int num = _wtoi(str);
同样,也有_wtof(),_wtol()等函数可供将CString 转成不同的数值类型.
posted @ 2009-01-06 13:16 无尘 阅读(1464) | 评论 (0) | 编辑 收藏
 
仅列出标题