В функции есть ссылка на неразрешенный внешний символ _wcstok

#include <ntddk.h>
#include <string.h>

.....

PWCHAR tmpBuf = NULL, pwBuf = NULL;;

tmpBuf = ExallocatePoolWithTag(NonPagePool, (MAX_SIZE + 1) * sizeof(WCHAR), BUFFER_TAG);
pwBuf = ExAllocatePoolWithTag(NonPagedPool, (MAX_SIZE + 1) * sizeof(WCHAR), BUFFER_TAG);

RtlStringCchPrintfW(tmpBuf, MAX_SIZE + 1, L"ws", ProcName);

pwBuf = wcstok(tmpBuf, L"\\");

...

Сообщение об ошибке:

ошибка LNK2019: ссылка на неразрешенный внешний символ _wcstok в функции

Но. wcslen работает


person koala    schedule 18.01.2016    source источник
comment
Какие версии компилятора/ddk/etc? Посмотрите, применимы ли Breaking Changes in Visual C++ 2015 — посмотрите для раздела wcstok.   -  person dxiv    schedule 18.01.2016
comment
Библиотеки, доступные в ядре, отличаются от пользовательских. wcstok может и не быть   -  person mksteve    schedule 18.01.2016
comment
Visual Studio 2013, ВДК 8.1   -  person koala    schedule 18.01.2016
comment
Вы компилируете в режиме C или C++?   -  person chqrlie    schedule 18.01.2016


Ответы (1)


Возможно, Microsoft пытается заставить вас использовать wsctok_s вместо стандартного, но не реентерабельного wsctok, особенно в коде драйвера устройства, связанном с ядром Windows.

Если strtok_s также отсутствует, это означает, что библиотека C для разработки ядра и драйверов не завершена. Вы находитесь в размещенной среде, части стандартной библиотеки C могут отсутствовать.

Обратите внимание, что вы не используете старый прототип для wcstok(): Microsoft изменила прототип для wcstok в VisualStudio 2015, чтобы привести его в соответствие со стандартом C:

 wchar_t *wcstok(wchar_t *restrict ws1, const wchar_t *restrict ws2,
                 wchar_t **restrict ptr);

Было бы лучше избегать использования этой функции и изменить свой код, чтобы использовать wcschr() напрямую.

Если wcschr тоже отсутствует, используйте эту простую реализацию:

/* 7.29.4.5 Wide string search functions */
wchar_t *wcschr(const wchar_t *s, wchar_t c) {
    for (;;) {
        if (*s == c)
            return (wchar_t *)s;
        if (*s++ == L'\0')
            return NULL;
    }
}

Вот стандартная совместимая реализация wcstok():

wchar_t *wcstok(wchar_t *restrict s1, const wchar_t *restrict s2,
                wchar_t **restrict ptr) {
    wchar_t *p;

    if (s1 == NULL)
        s1 = *ptr;
    while (*s1 && wcschr(s2, *s1))
        s1++;
    if (!*s1) {
        *ptr = s1;
        return NULL;
    }
    for (p = s1; *s1 && !wcschr(s2, *s1); s1++)
        continue;
    if (*s1)
        *s1++ = L'\0';
    *ptr = s1;
    return p;
}
person chqrlie    schedule 18.01.2016
comment
та же ошибка :( ошибка LNK2019: ссылка на неразрешенный внешний символ _wcstok_s в функции - person koala; 18.01.2016
comment
@koala: я изменил ответ, вы можете отменить голосование против и вместо этого проголосовать за ;->, но я сомневаюсь, что вы были тем, кто проголосовал против... - person chqrlie; 20.01.2016