在编译时使用GetUserNameEx的Visual Studio 2017中的错误

时间:2017-10-20 03:41:19

标签: 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;
}

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

Errors from Visual Studio 2017

你能帮帮我吗?好像编译器无法识别该功能。

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

2 个答案:

答案 0 :(得分:3)

两个问题:

  1. 似乎存在关于SEC_ENTRY的定义问题。 我认为这意味着定义为__stdcall。我还在研究这个。实际上通过包括<sspi.h&gt;解决了这个问题。首先是定义安全模型。

  2. 无论如何,对GetUserNameEx的调用不正确。

  3. 而不是:

    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;
    }
    

答案 1 :(得分:3)

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

来自Requirements部分:

  

标题: Secext.h(包括Security.h)

要解决此问题,请替换

#include <Secext.h>

#include <Security.h>

始终包含您被告知的头文件非常重要。头文件经常改变环境,当你试图包含直接声明符号的头时,会发生各种奇怪的事情。

您的通话中也有错误,传递错误的参数。它应该是这样的:

    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

(由于系统标题中的格式错误,导致SECURITY_MAC缺失。)

要解决此问题,请在包含&lt; Security.h&gt; #define预处理程序符号SECURITY_WIN32(对于用户模式应用程序 1 ) >,在代码中或通过项目设置,例如:

#define SECURITY_WIN32
#include <Security.h>

1 关于这些预处理器符号的信息非常少。最具启发性的评论来自&lt; NTSecPKG.h&gt; // Can't use the windows.h def'ns in kernel mode.条件内阅读#ifdef SECURITY_KERNEL。 {M}当时MFC仍然是一个跨平台框架,面向Windows以及“经典”Mac OS,可能是SECURITY_MAC。今天没有实际用途。