c++ - 在使用 NT DDK 构建的用户模式程序中包含 C++ header

标签 c++ c windows kernel wdk

所以...我有一个内核模式组件和一个用户模式组件,我正在使用 NT DDK 7.1.0 的交 key 构建环境放在一起。 .内核组件都是.c/.h/.rc文件。用户模式组件是 .cpp/.c/.h/.rc 文件。

起初,对两者都使用build 似乎是最简单的,因为我看到您可以修改 ./sources用户模式组件的文件说这样的话:

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

这似乎没有引起问题,所以我很高兴,直到我尝试 #include <string> (或 <memory> 或其他)找不到那个东西:

error C1083: Cannot open include file: 'string': No such file or directory

不过,它仍在使用 C++ 语言语义编译用户模式部分。但是我如何让标准包含工作?

从技术上讲,我不需要为用户模式部分使用 DDK build 工具。我可以制作一个 Visual Studio 解决方案。我有点担心,因为我遇到了其他烦恼,比如 DDK 使用 __stdcall 的事实。而不是 __cdecl默认情况下...并且没有任何编译指示或编译器开关可以覆盖它。你真的必须进入你关心的每一个声明并改变它,假设你有这样做的来源。 :-/

我开始怀疑这是否只是 的分形下降“仅仅因为你可以并不意味着你应该使用 DDK 构建用户模式应用程序。来吧龙。” 所以我的问题不仅仅是这个特定的技术障碍,而是我是否应该放弃使用 DDK 工具构建 C++ 用户模式组件的想法……仅仅因为内核组件是纯 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;
}

玩得开心!

关于c++ - 在使用 NT DDK 构建的用户模式程序中包含 C++ header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16975728/

相关文章:

C++ : initialize static member large array

c++ - gSoap 示例未编译

c++ - 从具有不同曝光时间的图像中获取 HDR 图像

c - C语言中初始化数组的方法

windows - 如何判断我的 web 服务在 Visual Studio 2005 中运行的帐户

c++ - 在使用 MFC 制作工具栏时需要帮助

c++ - 简单的 libcurl 应用程序 - 段错误

c - 如果以 32 位编译,Ubuntu 上的 getpwnam 行为会有所不同

windows - 检查运行时静态库或 dll 使用的是什么

windows - 如何从 Get-Location 输出中删除部分路径?