所以...我有一个内核模式组件和一个用户模式组件,我使用NT DDK 7.1.0的交钥匙构建环境放在一起。内核组件是所有.c / .h / .rc文件。用户模式组件是.cpp / .c / .h / .rc文件。
首先,对两者使用构建似乎最简单,因为我看到你可以修改用户模式组件的./sources
文件,如下所示:
TARGETNAME = MyUserModeComponent
TARGETTYPE = PROGRAM
UMTYPE = windows
UMENTRY = winmain
USE_MSVCRT = 1
这似乎没有引起问题,所以我很高兴,直到我尝试#include <string>
(或<memory>
或其他什么)找不到那些东西:
错误C1083:无法打开包含文件:'string':没有这样的文件或目录
但是,它正在用C ++语言语义编译用户模式。但是,我如何让标准包括工作?
从技术上讲,我不需要为用户模式部分使用DDK 构建工具。我可以制作视觉工作室解决方案。我有点担心,因为我遇到了其他烦恼,比如DDK默认使用__stdcall
而不是__cdecl
......并且没有任何编译指示或编译器开关来覆盖这个。你确实必须进入你关心的每个声明并改变它,假设你有源这样做。 : - /
我开始怀疑这只是一个分形下降到“只是因为你并不意味着你应该用DDK构建用户模式的应用程序。这里有龙。”所以我的问题不仅仅是关于这个特殊的技术障碍,而是我是否应该放弃使用DDK工具构建C ++用户模式组件的想法...只是因为内核组件是纯C。
答案 0 :(得分:3)
要使用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;
}
玩得开心!
答案 1 :(得分:2)
放弃使用DDK工具构建用户模式组件的想法(虽然我觉得这个概念很吸引人:-P)
作为一种良好实践,您的内核模式组件应与用户模式组件分开构建。
脱离我的头脑,而这实际上来自于有限的经验......如果你试图将两者混合在一起,会有许多微妙的差异。
使用你自己的__cdecl与__stdcall的例子;您有两种不同的调用约定。 _ cdecl是所有内核的东西,所有的C ++方法都在WINAPI( _stdcall)中传递约定,而__stdcall将清理自动堆栈清理并期望在整个地方插入帧指针。如果您偶然使用编译器选项来触发__fastcall,那么调试将是一件痛苦的事。
你绝对可以一起破解某些东西,但是你真的想在你的用户空间代码和构建环境中跟踪它吗?我说的是。
除非你有非常具体的工程原因要混合这两种环境,(并且没有统一的构建体验不是一个正当的理由,因为你可以从名为buildall.bat的批处理文件中获得)我说使用单独的工具链。