易语言取物理网卡MAC转化为特征字,采用了VB、CMD、汇编等等方法。
1、取本机网卡物理地址()
2、取本机所有网卡物理地址
3、CMD取网卡物理地址
4、VB取网卡物理地址
5、汇编取网卡物理地址
6、两种方式返回网卡特征码

511遇见(www.511yj.com) 

511遇见易语言软件本地注册验证

通过易语言自动的数据类型:网卡信息直接获取

.版本 2
.支持库 eAPI
.支持库 spec

.局部变量 网卡特征, 网卡信息, , "0"
.局部变量 n, 整数型

网卡特征 = 取网卡信息列表 ()
.计次循环首 (取数组成员数 (网卡特征), n)
    调试输出 (网卡特征 [n].物理地址)
    编辑框2.加入文本 (网卡特征 [n].物理地址 + #换行符)
.计次循环尾 ()

 

 需要用到取DOS返回,执行CMD

ipconfig/all在返回文本中寻找物理地址

511遇见(www.511yj.com) 

.版本 2

.子程序 取DOS返回, 文本型, 公开
.参数 dos命令, 文本型
.局部变量 CreatePipe_结构体, SECURITY_ATTRIBUTES, , , CreatePipe_结构体
.局部变量 进程启动信息_CreateProcess, STARTUPINFO, , , 进程启动信息CreateProcess
.局部变量 进程标识符_CreateProcess, PROCESS_INFORMATION, , , 进程标识符_CreateProcess
.局部变量 hRead, 整数型, , , 读取管道数据的文件句柄
.局部变量 hWrite, 整数型, , , 写管道数据的文件句柄
.局部变量 len, 整数型
.局部变量 txt, 字节集
.局部变量 EXIT, 整数型
.局部变量 返回文本, 文本型

' 结构体的大小初始化设置
CreatePipe_结构体.nLength = 12
' 设置安全描述
CreatePipe_结构体.lpSecurityDescriptor = 0
' 确定创建一个新进程时继承返回的句柄,如果为0,那么新进程将不会继承句柄,如果此字段设置为非0的值,那会就会继承该句柄
CreatePipe_结构体.bInheritHandle = 1
' 创建一个匿名管道
CreatePipe (hRead, hWrite, CreatePipe_结构体, 0)
' 应用程序必须初始化
进程启动信息_CreateProcess.cb = 68
' 制定wShowWindow有效
进程启动信息_CreateProcess.dwFlags = 位或 (#STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES)
' 为0不显示新建进程的主窗口,为1显示
进程启动信息_CreateProcess.wShowWindow = #SW_HIDE
进程启动信息_CreateProcess.hStdOutput = hWrite
进程启动信息_CreateProcess.hStdError = hWrite
' 判断操作系统类型,选择不同cmd
.如果 (取操作系统类别 () ≤ 2)
    ' 创建一个进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口
    CreateProcess (0, “command.com /c ” + dos命令, 0, 0, 真, 0, 0, 0, 进程启动信息_CreateProcess, 进程标识符_CreateProcess)

.否则
    CreateProcess (0, “cmd.exe /c ” + dos命令, 0, 0, 真, 0, 0, 0, 进程启动信息_CreateProcess, 进程标识符_CreateProcess)

.如果结束
' 开始CreatePipe (hRead, hWrite, CreatePipe_结构体, 0)创建了一个管道了,现在CreateProcess又创建了一个管道,应当先关闭多余的管道
CloseHandle_取DOS执行结果 (hWrite)
' 设立一个无限循环
.判断循环首 (len ≠ -1)
    ' 查看管道中的是否有数据
    PeekNamedPipe (hRead, 0, 0, 0, len, 0)
    .如果 (len ≠ 0)
        txt = 取空白字节集 (1024)
        ' 从管道中读取数据
        ReadFile (hRead, txt, 1023, len, 0)
        返回文本 = 返回文本 + 取字节集数据 (txt, #文本型, )

    .否则
        ' 查看一下指定的进程是否已经结束
        GetExitCodeProcess (进程标识符_CreateProcess.进程句柄, EXIT)
        ' 因为有的进程退出了,但管道中还有数据,所以必须在管道中没有数据的情况下判断程序是否已经结束,从而终止循环
        .如果真 (EXIT ≠ #STILL_ACTIVE)
            ' 彻底关闭管道
            CloseHandle_取DOS执行结果 (hRead)
            跳出循环 ()
        .如果真结束

    .如果结束
    ' 为了减轻系统的堵塞,
    处理事件 ()
    ' 输出调试文本 (到文本 (len))
.判断循环尾 ()
返回 (返回文本)
.版本 2

.子程序 MAC_取特征所有_cmd, 文本型, 公开
.局部变量 a, 文本型

a = 文本_取出中间文本 (取DOS返回 (“ipconfig/all”), “物理地址. . . . . . . . . . . . . : ”, #换行符, , )
返回 (a)

 获取本节多网卡MAC地址

.版本 2

.子程序 MAC_取特征所有_多网卡, 文本型, 公开, 获取本机MAC地址,可以获取多网卡MAC,失败返回空。
.参数 网卡序号, , 可空, 可以被省略。当本机有多块网卡时,指定要对其操作的网卡序号(从1开始)。
.局部变量 IPAA, IP_ADAPTER_ADDRESSES
.局部变量 pAdapterAddresses
.局部变量 outBufLen
.局部变量 Flags
.局部变量 Family
.局部变量 lRet
.局部变量 dwIndex
.局部变量 i
.局部变量 outBuff, 文本型, , "0"
.局部变量 MAC地址, 文本型, , "0"
.局部变量 tmpMAC, 文本型

Flags = 16
Family = 0
outBufLen = 0
pAdapterAddresses = 从堆栈分配内存_ (取进程堆栈句柄_ (), 8, 32)
lRet = GetAdaptersAddresses (Family, Flags, 0, pAdapterAddresses, outBufLen)
.如果真 (lRet = 111)
    pAdapterAddresses = HeapReAlloc (取进程堆栈句柄_ (), 8, pAdapterAddresses, outBufLen)
.如果真结束
lRet = GetAdaptersAddresses (Family, Flags, 0, pAdapterAddresses, outBufLen)
.如果真 (lRet = 0)
    i = 0
    重定义数组 (outBuff, 假, 1)
    拷贝内存_IP_ADAPTER (IPAA, pAdapterAddresses, Len_IP_ADAPTER (IPAA))
    tmpMAC = 取十六进制文本 (IPAA.PhysicalAddress [1]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [2]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [3]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [4]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [5]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [6])
    加入成员 (MAC地址, tmpMAC)
    .判断循环首 (IPAA.pNext ≠ 0)
        i = i + 1
        重定义数组 (outBuff, 真, i)
        拷贝内存_IP_ADAPTER (IPAA, IPAA.pNext, Len_IP_ADAPTER (IPAA))
        tmpMAC = 取十六进制文本 (IPAA.PhysicalAddress [1]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [2]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [3]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [4]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [5]) + “-” + 取十六进制文本 (IPAA.PhysicalAddress [6])
        .如果真 (tmpMAC ≠ “0-0-0-0-0-0”)
            加入成员 (MAC地址, tmpMAC)
        .如果真结束
        处理事件 ()
    .判断循环尾 ()
.如果真结束
释放堆栈内存_ (取进程堆栈句柄_ (), 0, pAdapterAddresses)
.如果真 (是否为空 (网卡序号))
    网卡序号 = 1
.如果真结束
返回 (MAC地址 [网卡序号])

所有调用命令:

511遇见(www.511yj.com)

.版本 2
.支持库 eAPI
.支持库 spec

.程序集 窗口程序集_启动窗口

.子程序 _按钮1_被单击, , , 取本机网卡物理地址

编辑框1.内容 = 取本机网卡物理地址 ()

.子程序 _按钮2_被单击, , , 取所有网卡
.局部变量 网卡特征, 网卡信息, , "0"
.局部变量 n, 整数型

网卡特征 = 取网卡信息列表 ()
.计次循环首 (取数组成员数 (网卡特征), n)
    调试输出 (网卡特征 [n].物理地址)
    编辑框2.加入文本 (网卡特征 [n].物理地址 + #换行符)
.计次循环尾 ()

.子程序 _按钮3_被单击, , , CMD_取所有网卡  

编辑框3.内容 = MAC_取特征所有_cmd ()

.子程序 _按钮4_被单击, , , VB_取所有网卡

编辑框4.内容 = VB_取硬件信息 (#MAC)

.子程序 _按钮5_被单击, , , MAC_取特征所有_多网卡

编辑框5.内容 = MAC_取特征所有_多网卡 (2)

.子程序 _按钮6_被单击, , , MAC_取特征所有

编辑框6.内容 = 到文本 (MAC_取特征所有 ())
调试输出 (取文本长度 (编辑框6.内容))

参考源码:1、511遇见易语言软件注册本地验证-3-取物理网卡MAC特征字

                 2、511遇见易语言软件注册教程

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐