天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 74|回复: 0

c++获取windows正在使用的网卡的MAC地址

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
++获取windows正在使用的网卡的MAC地址
这个方法是stackoverflow上找到的,在这做个记录,相关的头文件请查找我之前的文章

TCHAR szMac[MAX_PATH] = { 0 };
        int nBuffSize = MAX_PATH;
        std::string nError = "";
        if (szMac == NULL || nBuffSize < 18) return nError;

        HKEY hKey = NULL;
        HKEY hKey2 = NULL;
        TCHAR szKey[MAX_PATH], szBuffer[MAX_PATH];
        TCHAR szServiceName[MAX_PATH];
        TCHAR szFileName[MAX_PATH] = { 0 };
        DWORD dwRet = 0;
        DWORD dwType = 0;
        DWORD cbData = 0;
        DWORD cName = _countof(szBuffer);
        if (RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"), &hKey) != ERROR_SUCCESS)
                return nError;

        for (int i = 0; RegEnumKeyEx(hKey, i, szBuffer, &cName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, cName = _countof(szBuffer))
        {
                _tcscpy_s(szKey, MAX_PATH, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"));
                _tcscat_s(szKey, MAX_PATH, szBuffer);
                if (RegOpenKey(HKEY_LOCAL_MACHINE, szKey, &hKey2) != ERROR_SUCCESS)
                {
                        continue;
                }

                dwType = REG_SZ;
                cbData = MAX_PATH * sizeof(TCHAR);
                if (RegQueryValueEx(hKey2, _T("ServiceName"), NULL, &dwType, (LPBYTE)szServiceName, &cbData) == ERROR_SUCCESS)
                {
                        //读取成功后关闭句柄
                        RegCloseKey(hKey2);

                        _tcscpy_s(szFileName, MAX_PATH, _T("\\\\.\\"));
                        _tcscat_s(szFileName, MAX_PATH, szServiceName);
                        HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
                        if (hFile != INVALID_HANDLE_VALUE) {
                                DWORD dwInBuff = 0x01010101;
                                BYTE outBuff[MAX_PATH];
                                dwRet = DeviceIoControl(hFile, 0x00170002, &dwInBuff, sizeof(dwInBuff), outBuff, sizeof(outBuff), &cbData, NULL);

                                //无论成功失败关闭文件句柄
                                CloseHandle(hFile);
                                hFile = INVALID_HANDLE_VALUE;

                                if (dwRet)
                                {
                                        _stprintf_s(
                                                szMac, nBuffSize / sizeof(TCHAR),
                                                _T("%02X-%02X-%02X-%02X-%02X-%02X"),
                                                outBuff[0], outBuff[1], outBuff[2],
                                                outBuff[3], outBuff[4], outBuff[5]
                                        );
                                        break;
                                }
                        }
                }
                else
                {
                        //读取失败关闭句柄
                        RegCloseKey(hKey2);
                }
        }//end for
        if (hKey != NULL)
        {
                RegCloseKey(hKey);
        }
        std::string MAC;
        int iLen = WideCharToMultiByte(CP_ACP, 0, szMac, -1, NULL, 0, NULL, NULL);
        char* chRtn = new char[iLen * sizeof(char)];
        WideCharToMultiByte(CP_ACP, 0, szMac, -1, chRtn, iLen, NULL, NULL);
        MAC = chRtn;
        return MAC;



[code]原文链接:https://blog.csdn.net/mengxingchengshang/article/details/119574875[/code]

 

 

 

 

c++获取windows正在使用的网卡的MAC地址
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 12:27 , Processed in 0.149792 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表