【问题标题】:wdk ddk compiler problems with std::string and std::wstringstd::string 和 std::wstring 的 wdk ddk 编译器问题
【发布时间】:2011-04-08 08:34:27
【问题描述】:

我已经开始使用 WDK / DDK(我假设它们是同一个东西)示例,尤其是打印机端口监视器示例。我已经使用他们的构建工具进行了编译,我可以附加到假脱机进程并调试...好东西!

.. 当我只想写一些调试时,问题就来了。我真的认为这会很简单(有一段时间没有做 c++ 了!)但它似乎不是!

我遇到的当前问题只是尝试创建 std::wchar 的实例,如下所示:

std::wstring test("Blah");

问题是,当我使用 wdk 构建工具进行编译时,出现以下错误:

1>c:\winddk\7600.16385.1\src\print\monitors\localmon\localmon.c(361) :
 error C2143: syntax error : missing ';' before ':'
1>c:\winddk\7600.16385.1\src\print\monitors\localmon\localmon.c(363) :
 error C2143: syntax error : missing ';' before 'type'

我猜这是因为编译器可能不理解 std:: 位?行号指向上面的 wstring 声明。

我添加了include <string.h>,但这没有帮助,我的源文件如下:

!IFNDEF MSC_WARNING_LEVEL
MSC_WARNING_LEVEL=/W3
!ENDIF
MSC_WARNING_LEVEL=$(MSC_WARNING_LEVEL) /WX


C_DEFINES=-DUNICODE -D_UNICODE -D_SPL_CLUST

TARGETNAME=ddklocalmon
TARGETTYPE=DYNLINK
DLLENTRY=_DllMainCRTStartup
DLLDEF=localmon.def
DLLORDER=localmon.prf
TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib     \
           $(SDK_LIB_PATH)\advapi32.lib     \
           $(SDK_LIB_PATH)\user32.lib       \
           $(SDK_LIB_PATH)\ws2_32.lib       \
           $(SDK_LIB_PATH)\spoolss.lib

INCLUDES=$(INCLUDES);     \
         $(DDK_INC_PATH); \


USE_MSVCRT=1

SOURCES=localmon.rc  \
        localmon.c   \
        winspool.c   \
        util.c       \
        config.c     \
        xcv.c        \
        irda.c       \
        mem.c        \

PRECOMPILED_INCLUDE=precomp.h

另外,如果我让 wstring 正常工作,我将使用它和 OutputDebugString() 来处理我对 Visual Studio 输出控制台的调试,但我想我已经读到某处可能无法在端口监视器运行时工作在内核模式下?

如果有人能对此有所了解,我将不胜感激! :)

安迪。

【问题讨论】:

  • 正如其他人指出的那样,您需要包含<string>,而不是<string.h>。除此之外,宽字符串文字有一个 L 前缀 std::wstring test(L"Blah");
  • 酷,谁能回答剩下的问题,即在 c / 端口监视器中调试的最佳方式?
  • 记录/跟踪的标准基础设施是Event Tracing for Windows。它内置于系统中,可以在运行时启用和禁用,并且可以在用户态和内核模式代码中使用。

标签: c++ compiler-construction driver wdk


【解决方案1】:

std::stringstd::wstring 是 C++ 类(实际上是 C++ 类的 typedef),您正在编译 .c 文件。

在驱动中使用C++运行时库感觉有点奇怪,不知道能不能用。

如果您在哪里编译为 C++,则包含是 <string> 而不是 <string.h>

【讨论】:

  • 上面的例子是编译用户模式 ​​DLL - 不是驱动程序(用户模式代码 - DDK/WDK 也支持 EXE 和 DLL)。
  • 驱动程序中的 C++ 是合理的,如果您了解编译器在做什么。 IE。您必须了解何时无法调用已调出的代码。该限制在存在虚函数的情况下继续适用,当然 vtable 也不能被分页。
【解决方案2】:

几乎所有(如果不是全部)DDK 都使用 C,而不是 C++。

【讨论】:

  • 啊,很公平,谢谢!你知道我应该用什么来调试和记录等吗?相信没有什么简单的东西我可以使用?
  • 通过附加的 Windows 内核调试器调试打印(类似于 printf)。
【解决方案3】:

std::stringstd::wstring 是 C++ 标准库的一部分(包含在头文件中 - 而不是 @dalle 已经发布的 C 标准库的一部分)。

正如@dalle 已经发布的那样,您编译 C 源代码(示例是用 C 编写的)- C++ 源文件名的正确格式是 *.cpp

在用户模式下提供完整的 C++ 支持。因此,既然你有使用 C++ 的用户模式 ​​DLL 就可以了,你可以将文件重命名为 *.cpp(但看起来很难看,因为你将 C++ 块嵌入到纯 C 代码示例中)。

在内核模式代码中,C++ 支持非常有限。

如果您确实需要内核模式下的完整 C++ 语言支持,您可以使用一些技巧来启用它,但您自己做的事情非常复杂,需要大量的知识和经验(尽管有一些不完整的解决方案可供公开)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2012-11-12
    • 2020-03-03
    相关资源
    最近更新 更多