You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GetUserNameExA获取用户名和域时出现标识符未声明报错求助

GetUserNameExA 编译报错排查与修复

你代码里存在多处语法、链接、逻辑错误,逐一说明:

  • 缓冲区声明语法错误:CHAR *username = [200];是非法写法,既没有正确声明栈上数组,也没有给指针分配有效内存,属于语法错误,编译器会直接报错。
  • 冗余头文件引入:重复引入了两次<windows.h>和<Lmcons.h>,虽然不直接触发报错,但属于无意义的冗余代码。
  • 导入库缺失:GetUserNameExA实现在Secur32.dll中,仅引入头文件不链接对应导入库的话,链接阶段会报函数未定义错误。
  • 输出逻辑错误:用宽字符输出流wcout输出窄字符(CHAR类型)的用户名存在类型不匹配问题,且代码里输出的是枚举常量NameSamCompatible而非实际获取到的用户名变量,根本拿不到预期结果。
  • main函数返回值类型错误:标准C++要求main函数返回值类型为int,不是DWORD。
  • 缺少返回值检查:没有判断GetUserNameExA的调用结果,出现缓冲区不足、权限不足等问题时无法定位错误原因。

修正后可运行代码

// 如需兼容更旧的Windows SDK,可取消下一行的注释
// #define _WIN32_WINNT 0x0500
#include <windows.h>
#include <Lmcons.h>
#include <iostream>
#include <Security.h>
#include <secext.h>

// 链接对应导入库,解决函数未定义的链接错误
#pragma comment(lib, "Secur32.lib")

using namespace std;

int main()
{
    // 声明足够长度的缓冲区,UNLEN是用户名最大长度、DNLEN是域名最大长度,额外留2字节存分隔符和结束符
    CHAR username[UNLEN + DNLEN + 2] = {0};
    DWORD dwSize = sizeof(username);
    
    BOOL callResult = GetUserNameExA(NameSamCompatible, username, &dwSize);
    if (!callResult)
    {
        cout << "获取用户名失败,错误码:" << GetLastError() << endl;
        return 1;
    }

    cout << "Hello, " << username << "!\n";
    return 0;
}

如果编译时仍提示NameSamCompatible未声明,打开代码最上方定义_WIN32_WINNT的注释即可,这个宏用来指定程序兼容的最低Windows版本,旧版SDK需要显式声明该宏才能暴露对应枚举和函数声明。

内容的提问来源于stack exchange,提问作者Chantal87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:30:36