VC实现获取本机MAC地址的方法

本文实例采用vc6.0运行环境,通过实例实现获得MAC地址的功能。

完整的实例代码如下:

#include "stdafx.h"
#include  <stdio.h>
#include  <stdlib.h>
#include  <httpext.h>
#include  <windef.h>
#include  <Nb30.h>

int getMAC(char * mac)
{
 NCB ncb;
 typedef struct _ASTAT_
 {
  ADAPTER_STATUS  adapt;
  NAME_BUFFER  NameBuff  [30];
 }ASTAT,  *  PASTAT;
 ASTAT Adapter;   

 typedef struct _LANA_ENUM
 {  //  le
  UCHAR  length;
  UCHAR  lana[MAX_LANA];
 }LANA_ENUM  ;
 LANA_ENUM lana_enum;   

 UCHAR uRetCode;
 memset(&ncb, 0, sizeof(ncb));
 memset(&lana_enum, 0, sizeof(lana_enum));   

 ncb.ncb_command = NCBENUM;
 ncb.ncb_buffer = (unsigned char *)&lana_enum;
 ncb.ncb_length = sizeof(LANA_ENUM);
 uRetCode = Netbios(&ncb);
 if(uRetCode != NRC_GOODRET)
 return uRetCode;   

 for(int lana=0; lana<lana_enum.length; lana++)
 {
  ncb.ncb_command = NCBRESET;
  ncb.ncb_lana_num = lana_enum.lana[lana];
  uRetCode = Netbios(&ncb);
  if(uRetCode == NRC_GOODRET)
  break;
 }
 if(uRetCode != NRC_GOODRET)
  return uRetCode;   

 memset(&ncb, 0, sizeof(ncb));
 ncb.ncb_command = NCBASTAT;
 ncb.ncb_lana_num = lana_enum.lana[0];
 strcpy((char*)ncb.ncb_callname, "*");
 ncb.ncb_buffer = (unsigned char *)&Adapter;
 ncb.ncb_length = sizeof(Adapter);
 uRetCode = Netbios(&ncb);
 if(uRetCode != NRC_GOODRET)
  return uRetCode;
 sprintf(mac,"%02X-%02X-%02X-%02X-%02X-%02X",
 Adapter.adapt.adapter_address[0],
 Adapter.adapt.adapter_address[1],
 Adapter.adapt.adapter_address[2],
 Adapter.adapt.adapter_address[3],
 Adapter.adapt.adapter_address[4],
 Adapter.adapt.adapter_address[5]
 );
 return 0;
 }

int main(int argc, char* argv[])
{
 char  mac[200];
 getMAC(mac);
 printf("  mac  :  %s  \n",mac);  

 return 0;
}

另外还需要注意:必须在project->Setting里添加库文件“netapi32.lib”。

(0)

相关推荐

  • VC++基于Dx实现的截图程序示例代码

    本文所述的程序示例为VC++图象特效的截图示例,需要DirectX 3.0以上版,代码中的GetScreen函数是本截图程序的关键.运行这个程序可用Esc键结束.代码中需要ddutil.h与ddutil.cpp文件,请自行下载添加.关于InitDDraw()函数,功能是初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区),以及创建一个定时器. 具体的功能代码如下: #include <windows.h> #include <windowsx.h> #include

  • VC6.0实现读取Excel数据的方法

    Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法.具体步骤如下:   1.首先要将excel类添加到工程中. 在ClassWizard中,[Add Class],在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe:2007应该又独立的lib库,这个没有验证),添加必要的几个类: // Excel应用对象 _Application m_oExcelApp; // Excel程序 _Worksheet m_oW

  • VC程序设计中CreateProcess用法注意事项

    对于windows程序设计来说,启动一个进程有三种方法:WinExec,ShellExecute,CreateProcess.这里仅对CreateProcess的用法加以说明. 对于CreateProcess的详细参数读者可以查MSDN和<Windows API参考手册>,这里不具体说明.下面给出常用的方法: STARTUPINFO startup; ZeroMemory( &startup, sizeof(startup) ); startup.cb = sizeof(startup

  • VC实现动态菜单的创建方法

    本文简述了在程序不支持MFC,CMenu不可用的情况下,动态创建系统托盘菜单的方法.由于菜单项是不确定的,因而就需要用 sdk 创建一个动态弹出菜单. 主要实现代码如下: //------------------ code begin ---------------- //在类中定义的变量: // 双击托盘图标时对应的菜单项 id. UINT m_nDClickMenuItemId; // 弹出菜单句柄. m_hMenu m_hMenu; ///动态创建右键菜单项. ///@param item

  • VC++简单实现关机、重启计算机实例代码

    本文以一个实例形式介绍了VC++简单实现关机.重启计算机的方法,代码比较实用,有一定的参考价值.完整实例代码如下: void CWebBrowserView::OnMenuShutdown() { // TODO: 在此添加命令处理程序代码 if (AfxMessageBox("确定要关机吗?",MB_YESNO) == IDYES) { HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process. if (

  • VC动态生成菜单项的实现方法

    本例所述为使用VC编写的一个可以动态生成菜单项的类文件,这里展示的是其核心代码,代码备有比较详细的注释,相对而言理解起来并不复杂. 主要功能代码如下: #include "stdafx.h" #include "Test.h" #include "TestDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序"关于"菜单项的 CAboutDlg 对话框 class

  • VC6.0如何创建以及调用动态链接库实例详解

    小弟在公司的职责,在上篇博客中已经简约介绍.这边博客主要介绍技术的应用而不在细究原理.因为公司项目着急,出结果要紧,并且咱也不是专注搞研究的,所以,基本懂了原理后,直接上手工作,搞出demo来最好. 至于公司工作情况,今天暂且略过,当然也不是一两句能够表达清楚的.后面会有相应的工作总结,敬请期待-- 现在,废话少说,直奔主题--VC6.0中创建动态链接库. 作为客户与后台的中介,为了更好的调节两方的关系,我明智滴选择了webservice以及动态链接库.在与客户c++使动态链接库方式,而与后台j

  • VC MFC非模态对话框的实现方法

    众所周知的,MFC中非模态对话框在显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.本文就来给大家讲解一下非模态对话框的实现方法: 一.非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,因此,在创建模态对话框时所创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 二.创建及显示非模态对话框的步骤 需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg::OnBnCli

  • VC++操作SQLite简单实例

    对于很多程序员来说,SQLite并不陌生.SQLite 是一款主要用于嵌入式的开源数据库,可集成在自己的桌面程序中,也可替代Access作为后台数据库.SQLite 支持多数SQL92标准,例如:索引.限制.触发和查看支持,支持 NULL.INTEGER.REAL.TEXT 和 BLOB 数据类型,支持事务.以下是一些SQLite的简单使用. //建立数据库 C:\sqlite-3_6_11> sqlite3.exe dbname.db 建立数据库的时候sqlite3.exe后面跟数据库文件名

  • VC实现批量删除指定文件的方法

    本文所述实例主要实现了删除某个盘符下指定位置的文件,可以是TXT.doc.jpeg等格式,只要选定格式后,再定义好盘符,即可一键删除所有指定类型的文件.再次提示删除前请确认,且删除后不可恢复. 以下是最主要的核心代码,其它代码读者可以自己添加. SHFILEINFO shInfo; memset(&shInfo,0,sizeof(SHFILEINFO)); HIMAGELIST hImage = (HIMAGELIST)SHGetFileInfo("C:\\",0,&s

随机推荐