我正在尝试使用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个与代码无关,除了错误的函数调用。
答案 0 :(得分:3)
两个问题:
似乎存在关于SEC_ENTRY
的定义问题。 我认为这意味着定义为实际上通过包括__stdcall
。我还在研究这个。<sspi.h
&gt;解决了这个问题。首先是定义安全模型。
无论如何,对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;
}
答案 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
。今天没有实际用途。