wdk ddk使用std :: string和std :: wstring编译问题

时间:2011-04-08 08:34:27

标签: c++ compiler-construction driver wdk

我开始玩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输出控制台,但我想我已经读过某个地方,这可能不起作用,因为端口监视器运行在内核模式?

如果有人能对此有所了解,我真的很感激! :)

安迪。

3 个答案:

答案 0 :(得分:2)

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

在驱动程序中使用C ++运行时库感觉有点奇怪,我不知道它是否有效。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

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

如果你真的需要在内核模式下提供完整的C ++语言支持,你可以使用一些技巧来实现它,但是你自己需要很多知识和经验这是非常复杂的事情(尽管有一些不完整的解决方案可用于公开)。