使用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
相关产品推荐
相关产品推荐

