我正在尝试使用 GetUserNameEx,但甚至无法编译它,因为我遇到了大量错误。这是我的代码:
#include <Windows.h>
#include <Secext.h>
#include <tchar.h>
#include <wchar.h>
#pragma comment(lib, "Secur32.lib")
int wmain(int argc, WCHAR *argv[])
{
//GetUserNameEx()
EXTENDED_NAME_FORMAT nameFormat = NameDnsDomain;
WCHAR nameExtended[256 + 1];
DWORD sizeExtended = 256 + 1;
if (GetUserNameEx(nameExtended, &sizeExtended))
{
wprintf(L"%s\n", nameExtended);
}
else
{
wprintf(L"Error code: %lu\n", GetLastError());
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这些是我在尝试编译时遇到的错误:
你能帮助我吗?似乎编译器无法识别该函数。
编辑:我不能包含所有错误,因为大约有 48 个与代码无关,除了错误的函数调用。
您包含了错误的标题。该文档通常包含两条有关头文件的信息:声明符号的头文件,以及您应该声明的头文件#include
。
从要求部分:
头文件: Secext.h(包括Security.h)
要解决问题,请更换
#include <Secext.h>
Run Code Online (Sandbox Code Playgroud)
和
#include <Security.h>
Run Code Online (Sandbox Code Playgroud)
始终包含您被告知的头文件很重要。头文件经常改变环境,当你试图直接包含声明符号的头文件时,可能会发生各种奇怪的事情。
您的调用中还有一个错误,传递了错误的参数。应该是这样的:
WCHAR nameExtended[256 + 1];
ULONG sizeExtended = 256 + 1;
if (GetUserNameExW(NameDnsDomain, nameExtended, &sizeExtended)) {
// ...
Run Code Online (Sandbox Code Playgroud)
编译它会产生以下错误:
Run Code Online (Sandbox Code Playgroud)fatal error C1189: #error: You must define one of SECURITY_WIN32, SECURITY_KERNEL, or
(SECURITY_MAC
由于系统标题中的格式错误,尾随丢失。)
为了解决这个问题,#define
在包含<Security.h>之前的预处理器符号SECURITY_WIN32
(对于用户模式应用程序1),无论是在代码中还是通过项目设置,例如:
#define SECURITY_WIN32
#include <Security.h>
Run Code Online (Sandbox Code Playgroud)
1 关于这些预处理器符号的信息很少。最有启发的评论是从<NTSecPKG.h>读取// Can't use the windows.h def'ns in kernel mode.
的内部#ifdef SECURITY_KERNEL
条件。SECURITY_MAC
可能是从那个时候开始,当时 MFC 仍然是一个跨平台框架,针对 Windows 以及“经典”Mac OS。它在今天没有实际用途。
归档时间: |
|
查看次数: |
837 次 |
最近记录: |