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