函数中引用了未解析的外部符号 _wcstok
Unresolved external symbol _wcstok referenced in function
#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"\");
...
错误信息:
error LNK2019: unresolved external symbol _wcstok referenced in function
但是。 wcslen
有效
Microsoft 可能试图强制您使用 wsctok_s
而不是符合标准但 non-reentrant wsctok
,尤其是在与 Windows 内核链接的设备驱动程序代码中。
如果strtok_s
也不见了,说明内核和驱动开发的C库不完整。您在托管环境中,部分标准 C 库可能丢失。
请注意,您没有使用 wcstok()
的旧原型:Microsoft 在其 VisualStudio 2015 中更改了 wcstok
的原型,使其符合 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'[=11=]')
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'[=12=]';
*ptr = s1;
return p;
}
#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"\");
...
错误信息:
error LNK2019: unresolved external symbol _wcstok referenced in function
但是。 wcslen
有效
Microsoft 可能试图强制您使用 wsctok_s
而不是符合标准但 non-reentrant wsctok
,尤其是在与 Windows 内核链接的设备驱动程序代码中。
如果strtok_s
也不见了,说明内核和驱动开发的C库不完整。您在托管环境中,部分标准 C 库可能丢失。
请注意,您没有使用 wcstok()
的旧原型:Microsoft 在其 VisualStudio 2015 中更改了 wcstok
的原型,使其符合 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'[=11=]')
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'[=12=]';
*ptr = s1;
return p;
}