在编译时使用 GetUserNameEx 在 Visual Studio 2017 中出现大量错误

Ser*_*ron -1 c winapi

我正在尝试使用 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)

这些是我在尝试编译时遇到的错误:

Visual Studio 2017 中的错误

你能帮助我吗?似乎编译器无法识别该函数。

编辑:我不能包含所有错误,因为大约有 48 个与代码无关,除了错误的函数调用。

IIn*_*ble 6

您包含了错误的标题。该文档通常包含两条有关头文件的信息:声明符号的头文件,以及您应该声明的头文件#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)

编译它会产生以下错误:

fatal error C1189: #error:   You must define one of SECURITY_WIN32, SECURITY_KERNEL, or
Run Code Online (Sandbox Code Playgroud)

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。它在今天没有实际用途。