阅读:2204回复:3
使用C++写驱动遇到的问题
使用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++编译,宏开关却出了问题。在宏开关后删除几个字节的内容,然后又将那几个字节输入,就可以正常编译了。 |
|
|
沙发#
发布于:2009-02-12 11:27
好详细,学习
|
|
|
板凳#
发布于:2009-03-23 17:14
楼主我爱你,C++转C,有很深刻的学问。总结一点是一点。谢谢
![]() |
|
地板#
发布于:2009-04-18 00:52
谢了楼主,我就碰到了你说的第四条问题,呵呵,多谢多谢。
|
|