dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
阅读:2204回复:3

使用C++写驱动遇到的问题

楼主#
更多 发布于:2009-01-30 02:36
                                     使用C++写驱动遇到的问题
     放假里,对“使用C++写驱动”做了实验,下面列出了一些实际遇到的问题。我的测试环境是WDK 6001.18001。
1.当class有虚函数的时候,会报告
error LNK2019: unresolved external symbol "void __cdecl operator delete(void *)"
这个通过重载delete运算符就可以解决。
提示没有找到delete函数的实现。
2.DriverEntry函数申明为C导出
/*
extern "C"
{
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath);
};
*/
3.默认不提供new和delete函数的实现
必须使用自己重载这两个运算符。
4.不能使用全局的类对象,也不能使用静态类对象
error LNK2019: unresolved external symbol _atexit referenced in function "void __cdecl `dynamic initializer
5.虚析构函数在使用父类指针析构子类对象时是必须使用的
否则调用delete使用父类指针删除子类对象会丢失掉子类的析构函数调用。 (这个其实是一个C++的基础问题。VC6生成的类默认析构函数就是虚函数的,而VS2008默认的却不是。使用VS2008作为代码编辑器就必须注意这个问题。)
6.内存的泄漏检查可以通过重载new和delete运算符实现。
#define  debug_new(x) new(x,__FILE__, __LINE__)
#define  debug_delete delete
void* __cdecl operator new(size_t nSize,int nPoolType, LPCSTR lpszFileName, int nLine);
void* __cdecl operator new[](size_t nSize,int nPoolType, LPCSTR lpszFileName, int nLine);
void __cdecl operator delete(void* p);
void __cdecl operator delete[](void* p);
必须对对象数组和对象分别检测内存泄漏。
7.函数重载是没有问题的
8.虚函数的使用必须小心
虚函数是使用一个函数指针来实现的,这个函数指针的内存分配是与对象的内存分配有关的。
换句话说,如果对象是从PagedPool内存中分配出来的,那么虚函数指针也是PagePool类别的,这个对象的所有虚函数的调用都不能在DISPATH_LEVEL上调用。
9.代码页的属性问题
当代码页位于可丢弃段或者是分页的段的时候,会出问题。最简单的方法就是不要使用那些代码页属性,
默认所有的代码页都位于内存中。
10.对象数组的内存分配问题
当分配一个对象数组的时候,实际分配的内存大小=sizeof(ULONG)+sizeof(对象)*对象数目
这个ULONG负责记录一个记录对象数目,而且是分配在内存的最前面的。我们获得的一个指向对象数组的指针实际上是实际分配的内存指针+sizeof(ULONG)的结果。
11.默认的异常处理需要修改
try{ }except(EXCEPTION_EXECUTE_HANDLER) { }
修改为
__try{ }__except(EXCEPTION_EXECUTE_HANDLER) { }
12.C++的类型检查比C严格
许多类型转换相关的东西都需要做一下调整。
13.如果驱动中的动态链接库需要同时支持C调用和C++调用,在头文件中必须使用下面宏声明为C函数导出。
#ifdef __cplusplus
extern "C" {
#endif
......
#ifdef __cplusplus
}
#endif
14.声明为C函数导出的函数所在CPP中必须包含对应的头文件
比如a.cpp中必须包含a.h。如果不包含,当使用C编译的时候没有问题。使用C++编译时,lib里面的内容会不正确,其他使用这个lib的驱动编译时会报告函数找不到。
15.宏开关有时候会出问题
在C编译时,没有任何问题的代码,使用C++编译,宏开关却出了问题。在宏开关后删除几个字节的内容,然后又将那几个字节输入,就可以正常编译了。
一切都是时间问题!
alwaysrun
驱动小牛
驱动小牛
  • 注册日期2006-06-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1059分
  • 威望752点
  • 贡献值1点
  • 好评度98点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-02-12 11:27
好详细,学习
一颗平常的心!
boildoctor
驱动牛犊
驱动牛犊
  • 注册日期2009-03-11
  • 最后登录2009-04-04
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望271点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-03-23 17:14
楼主我爱你,C++转C,有很深刻的学问。总结一点是一点。谢谢
fenghuangyuyico
驱动牛犊
驱动牛犊
  • 注册日期2007-07-07
  • 最后登录2009-04-25
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-04-18 00:52
谢了楼主,我就碰到了你说的第四条问题,呵呵,多谢多谢。
游客

返回顶部