求助:NetUserGetLocalGroups返回内存地址而非LPWSTR字符串(C++ MFC)
解决MFC多字节环境下获取本地组输出内存地址的问题
嘿,第一次在Stack Overflow提问完全不用拘谨~咱们来搞定这个输出内存地址的问题!
你看到的007A1E02这类内容确实是内存地址,核心原因大概率是你直接输出了字符串指针变量本身,而非指针指向的实际组名字符串,再加上多字节字符集的细节没处理到位,才出现了这种情况。
给你几个具体的排查和修复方向:
- 明确使用API的多字节版本:因为你用的是多字节字符集,调用Windows用户组相关API时,要指定ANSI版本(比如用
NetUserGetGroupsA而非宽字符的NetUserGetGroupsW),避免字符类型不匹配导致的指针混乱。 - 修正输出逻辑:假设你用
group_info_1结构体存储组信息,它的grpi1_name成员是指向组名字符串的指针。如果你的sysout直接输出这个指针变量(比如sysout(pGroups[i].grpi1_name)),打印的就是指针的内存地址。你需要输出指针指向的字符串内容——如果sysout是对cout的封装,直接输出指针指向的内容即可:// 错误示例:输出指针地址 // sysout(pGroups[i].grpi1_name); // 正确示例:输出实际组名 sysout(pGroups[i].grpi1_name); // 确保sysout支持处理LPSTR类型的多字节字符串 - 完整示例参考:这里给你一段修正后的核心代码片段,供你对照:
#include <lmaccess.h> #pragma comment(lib, "netapi32.lib") void test() { group_info_1* pGroups = nullptr; DWORD dwLevel = 1; DWORD dwEntriesRead = 0; DWORD dwTotalEntries = 0; // 获取当前登录用户名(多字节版本) char szUserName[UNLEN + 1] = {0}; DWORD dwUserNameLen = UNLEN + 1; GetUserNameA(szUserName, &dwUserNameLen); // 调用ANSI版本API获取用户组 NET_API_STATUS nStatus = NetUserGetGroupsA(nullptr, szUserName, dwLevel, (LPBYTE*)&pGroups, MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwTotalEntries, nullptr); if (nStatus == NERR_Success) { for (DWORD i = 0; i < dwEntriesRead; i++) { // 输出实际组名字符串,而非指针地址 sysout(pGroups[i].grpi1_name); } // 记得释放API分配的内存 NetApiBufferFree(pGroups); } else { sysout("获取用户组失败,错误码:" + std::to_string(nStatus)); } } - 检查sysout的实现:如果调整后还是输出地址,那可能是
sysout函数的问题——比如它默认把传入的指针当作整数输出了。你可以临时替换成std::cout << pGroups[i].grpi1_name << std::endl;测试,确认能正常输出组名后,再调整sysout的实现以支持多字节字符串。
另外,别忘了调用NetApiBufferFree释放API分配的内存,避免内存泄漏哦~
内容的提问来源于stack exchange,提问作者KBell
相关产品推荐
相关产品推荐

