Проблемы с компилятором wdk ddk с std :: string и std :: wstring - PullRequest
0 голосов
/ 08 апреля 2011

Я начал играть с образцами WDK / DDK (я предполагаю, что они одно и то же) и, в частности, пример монитора порта принтера. У меня есть эта компиляция с использованием их инструмента сборки, и я могу присоединиться к процессу буфера и отладить с помощью ... хороших вещей!

.. Проблема возникает, когда я просто хочу написать отладку. Я действительно думал, что это будет просто (не занимался с ++ некоторое время!), Но, похоже, нет!

Текущая проблема, с которой я столкнулся - это просто попытка создать экземпляр 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 ]

2 голосов
/ 08 апреля 2011

std::string и std::wstring являются классами C ++ (фактически, typedefs для классов C ++), и вы компилируете файлы .c.

Использование библиотек времени исполнения C ++ в драйверах кажется немного странным, я не знаю, работает ли оно.

Если вы компилируете как C ++, включите <string>, а не <string.h>.

1 голос
/ 08 апреля 2011

Почти все, если не все, DDK используют C, а не C ++.

0 голосов
/ 08 апреля 2011

std::string и std::wstring является частью стандартной библиотеки C ++ (включена в заголовочный файл - НЕ является частью стандартной библиотеки C, поскольку @dalle уже опубликовал).

И как @dalle уже опубликовалВы компилируете исходный код C (примеры написаны на C) - правильный формат для имени исходного файла C ++: * .cpp

Полная поддержка C ++ доступна в пользовательском режиме.Таким образом, поскольку у вас есть DLL в пользовательском режиме, с помощью C ++ все в порядке, вы переименовываете файлы в * .cpp (но выглядит уродливо, потому что встраиваете фрагменты C ++ в примеры кода на чистом C).

В коде режима ядра, однако,Поддержка C ++ очень ограничена.

Если вам действительно нужна полная поддержка языка C ++ в режиме ядра, вы можете использовать некоторые приемы, чтобы включить ее, но это очень сложная вещь, которую нужно сделать самостоятельно, что требует больших знаний и опыта (хотя есть некоторые неполные решения, доступные для общественности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...