在用NT DDK构build的用户模式程序中包含C ++头文件

所以…我有一个内核模式组件和一个用户模式组件,使用NT DDK 7.1.0的交钥匙构build环境。 内核组件都是.c / .h / .rc文件。 用户模式组件是.cpp / .c / .h / .rc文件。

起初,使用构build似乎是最简单的,因为我看到你可以修改用户模式组件的./sources文件来说:

 TARGETNAME = MyUserModeComponent TARGETTYPE = PROGRAM UMTYPE = windows UMENTRY = winmain USE_MSVCRT = 1 

这似乎并没有引起问题,所以我很高兴,直到我试图#include <string> (或<memory> ,或其他)没有find的东西:

错误C1083:无法打开包含文件:“string”:没有这样的文件或目录

不过,它正在用C ++语言语义编译用户模式片断。 但是,我如何获得标准包括工作?

我在技术上不需要为用户模式部分使用DDK 构build工具。 我可以做一个视觉工作室解决scheme。 我有点担心,因为我碰到了其他的烦恼,如DDK默认使用__stdcall而不是__cdecl这个事实…没有任何编译指示或编译器开关来覆盖这个。 你真的必须进入你关心的每一个声明,并改变它,假设你有源代码这样做。 : – /

我开始怀疑这是不是只是一个分形下降到“只是因为你可以并不意味着你应该build立与DDK用户模式的应用程序,这里是龙。 所以我的问题不仅仅是关于这个特殊的技术障碍,而是如果我放弃使用DDK工具构buildC ++用户模式组件的想法…仅仅因为内核组件是纯C的。

Solutions Collecting From Web of "在用NT DDK构build的用户模式程序中包含C ++头文件"

要用WINDDK构建一个用户模式程序,你需要在你的SOURCES文件中添加一些变量:

  • 386_STDCALL=0默认使用cdecl调用约定
  • USE_STL=1使用STL
  • USE_NATIVE_EH=1添加对异常处理的支持

你已经拥有的一切

我将把我的完整的SOURCES文件作为参考:

 TARGETNAME = MyUserModeComponent TARGETTYPE = PROGRAM TARGETPATH = obj UMTYPE = console UMENTRY = main USE_MSVCRT = 1 USE_NATIVE_EH=1 USE_STL=1 386_STDCALL=0 SOURCES= main.cpp 

和main.cpp:

 #include <iostream> #include <string> using namespace std; int main() { string s = "bla bla bla!"; cout << s; return 0; } 

玩的开心!

快速回答

放弃使用DDK工具构建用户模式组件的想法(虽然我觉得这个概念很吸引人:-P)

您的内核模式组件应该与用户模式组件分开构建,作为一个良好的实践。

模糊的想法

在我的头顶,这实际上是从有限的经验来讲的……如果你试图把两者混合在一起,就会有很多微妙的差异。

用你自己的例子__cdecl vs __stdcall; 你有两个不同的调用约定。 _cdecl是所有内核的东西,所有的C ++方法都包装在WINAPI( _stdcall)传递约定中,__stdcall将清除自动堆栈清理,并期望帧指针遍布整个地方。 如果您偶然使用编译器选项来触发__fastcall,调试将会很痛苦。

你肯定可以一起破解一些东西,但是你真的想要跟踪你的用户空间代码和构建环境吗? UGH我说。

除非你有非常特定的工程原因来混合这两个环境,(没有一个统一的编译经验不是一个有效的原因,因为你可以从一个名为buildall.bat的批处理文件中获得),我说使用单独的工具链。