我已经开始使用 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 输出控制台的调试,但我想我在某处读到这可能不起作用,因为端口监视器在内核中运行模式?
如果有人能阐明这一点,我将非常感激! :)
安迪。
std::string
和 std::wstring
是 C++ 类(实际上是 C++ 类的 typedef),并且您正在编译 .c 文件。
在驱动中使用C++运行库感觉有点奇怪,不知道行不行。
如果您在哪里编译为 C++,则包含是
<string>
而不是 <string.h>
。
几乎所有(如果不是全部)DDK 使用 C,而不是 C++。
std::string
和 std::wstring
是 C++ 标准库的一部分(包含在头文件中 - 不是 C 标准库的一部分,@dalle 已经发布了)。
正如 @dalle 已经发布的那样,您编译了 C 源代码(示例是用 C 编写的) - C++ 源文件名的正确格式是 *.cpp
在用户模式下提供完整的 C++ 支持。因此,既然您有使用 C++ 的用户模式 DLL,那么您可以将文件重命名为 *.cpp(但看起来很难看,因为您将 C++ 块嵌入到纯 C 代码示例中)。
然而,在内核模式代码中,C++ 支持非常有限。
如果您确实需要在内核模式下提供完整的 C++ 语言支持,您可以使用一些技巧来启用它,但是您自己做的事情非常复杂,需要大量的知识和经验(尽管有一些不完整的解决方案可供公众使用) .