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

C Visual Studio 2017在编译时使用GetUserNameEx时出现大量错误,c,winapi,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,但甚至无法编译它,因为我遇到了大量错误。这是我的代码:

   #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;
}
以下是我在尝试编译时遇到的错误:

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

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

两个问题:

似乎存在有关SEC_进入的定义问题。我相信它的定义是uu stdcall。我还在研究这个。它实际上是通过包含第一个安全模型并定义一个安全模型来解决的

无论如何,对GetUserNameEx的调用是不正确的

与此相反:

if (GetUserNameEx(nameExtended, &sizeExtended))
应该是这样的:

if (GetUserNameEx(nameFormat, nameExtended, &sizeExtended))
调整代码:

#define SECURITY_WIN32
#include <Windows.h>
#include <sspi.h>
#include <secext.h>
#include <stdio.h>

#pragma comment(lib, "Secur32.lib")

int wmain(int argc, WCHAR *argv[])
{

    //GetUserNameEx()
    EXTENDED_NAME_FORMAT nameFormat = NameDnsDomain;
    WCHAR nameExtended[256 + 1] = {};
    DWORD sizeExtended = ARRAYSIZE(nameExtended);

    if (GetUserNameEx(nameFormat, nameExtended, &sizeExtended))
    {
        wprintf(L"%s\n", nameExtended);
    }
    else
    {
        wprintf(L"Error code: %lu\n", GetLastError());
    }
    return 0;
}

您包含了错误的标题。文档通常包含两条关于头的信息:声明符号的头文件,以及应该包含的头文件

本节:

标题:Secext.h包括Security.h

要解决此问题,请替换

#include <Secext.h>
编译此文件会产生以下错误:

由于系统标头中的格式错误,缺少尾随的SECURITY_MAC

要解决此问题,请先为用户模式应用程序1定义预处理器符号SECURITY_WIN32,然后在代码中或通过项目设置包括,例如:

#define SECURITY_WIN32
#include <Security.h>

1关于这些预处理器符号的信息很少。最有启发性的评论来自阅读//无法在内核模式下使用windows.h def'ns。在ifdef SECURITY_内核条件中。SECURITY_MAC很可能是从那个时候开始的,当时MFC仍然是一个跨平台框架,面向Windows和经典MAC操作系统。现在它没有实际用途。

寻求调试帮助的问题此代码为什么不起作用?必须在问题本身中包含错误。不想写大约48个错误。正如您在答案中看到的,定义存在问题。不要显示IntelliSense错误。唯一有趣的错误是构建错误。以文本形式发布它们。未来寻求帮助的访问者无法找到此问答,因为无法轻松搜索图像。文本可以。否决此答案的人是否愿意解释他的不喜欢?可能是因为你建议包含错误的标题?我个人不喜欢主动忽略文档。定义安全性\u WIN32为我修复了用户模式应用程序的错误。非常感谢。
    WCHAR nameExtended[256 + 1];
    ULONG sizeExtended = 256 + 1;

    if (GetUserNameExW(NameDnsDomain, nameExtended, &sizeExtended)) {
        // ...
fatal error C1189: #error:   You must define one of SECURITY_WIN32, SECURITY_KERNEL, or
#define SECURITY_WIN32
#include <Security.h>