assume2013 发表于 2023-10-31 21:39:05

获取MAC的API在火山PC运行报错,怎么解决字节数组传址?

本帖最后由 assume2013 于 2023-10-31 21:45 编辑


在火山PC的通信测试里没找到根据IP地址获取到MAC的方法,在易语言源码找到获取MAC的源码,都不懂怎么搬到火山?求大佬指点
一个简单的inet_addrAPI在易语言声明如下:http://cxw521.bvimg.com/21068/d61b5c3035011c12.png
https://s3.bmp.ovh/imgs/2023/10/31/9ac9a0205400f4ad.png运行正常,而我在火山PC声明如下:http://cxw521.bvimg.com/21068/cbbcb7e04e9460b4.png
运行却报错, 不懂为什么报错?
还如一个函数API在易语言声明如下:http://cxw521.bvimg.com/21068/6f4552b258e2c6dd.png
我在火山这样声明:
http://cxw521.bvimg.com/21068/10bd4efad7e1e63c.png
对于这样的字节型数组,火山PC应该怎么传址?
易语言的获取MAC方法调用如下图:
http://cxw521.bvimg.com/21068/7c9e781ac3bcc369.png
这就是根据IP获取方法,在火山PC怎么实现,非常多谢各位大佬。


Xelloss0618 发表于 2023-11-1 20:52:36

本帖最后由 Xelloss0618 于 2023-11-1 22:54 编辑

<火山程序 类型 = "通常" 版本 = 1 />

方法 IP取MAC地址 <公开 静态 类型 = 文本型 注释 = "表格DLL写法" 折叠>
参数 IP地址 <类型 = 文本型>
{
    变量 MacAddr <类型 = "字节 ">
    变量 PhyAddrLen <类型 = 整数>
    变量 Mac <类型 = 文本型>
    PhyAddrLen = 6
    如果 (SendARP (inet_addr (文本到多字节 (IP地址).取字节集指针 ()), 0, 取数组变量地址 (MacAddr), 取变量地址 (PhyAddrLen)) == 0)
    {
      计次循环 (PhyAddrLen)
      {
            如果 (取循环索引 () == PhyAddrLen - 1)
            {
                加入格式文本 (Mac, "%.2X", 无符号字节到整数 (MacAddr [取循环索引 ()]))
            }
            否则
            {
                加入格式文本 (Mac, "%.2X-", 无符号字节到整数 (MacAddr [取循环索引 ()]))
            }
      }
    }
    返回 (Mac)

}

方法 IP取MAC地址2 <公开 静态 类型 = 文本型 注释 = "嵌入式封装API写法" 折叠>
参数 IP地址 <类型 = 文本型>
{
    变量 MacAddr <类型 = "字节 ">
    变量 PhyAddrLen <类型 = 整数>
    变量 Mac <类型 = 文本型>
    PhyAddrLen = 6
    如果 (SendARP2 (inet_addr2 (IP地址), 0, MacAddr, PhyAddrLen) == 0)
    {
      计次循环 (PhyAddrLen)
      {
            如果 (取循环索引 () == PhyAddrLen - 1)
            {
                加入格式文本 (Mac, "%.2X", 无符号字节到整数 (MacAddr [取循环索引 ()]))
            }
            否则
            {
                加入格式文本 (Mac, "%.2X-", 无符号字节到整数 (MacAddr [取循环索引 ()]))
            }
      }
    }
    返回 (Mac)
}

方法 inet_addr <公开 静态 类型 = 整数 折叠 @输出名 = "inet_addr" @视窗.输入 = "Ws2_32.dll">
参数 cp <类型 = 变整数 注释 = "这个API只接受ANSI编码文本,不能用文本型">

方法 SendARP <公开 静态 类型 = 整数 折叠 @输出名 = "SendARP" @视窗.输入 = "Iphlpapi.dll">
参数 DestIP <类型 = 整数>
参数 SrcIP <类型 = 整数 @默认值 = 0>
参数 pMacAddr <类型 = 变整数 注释 = "至少8个字节的指针">
参数 PhyAddrLen <类型 = 变整数 注释 = "整数变量指针">

方法 inet_addr2 <公开 静态 类型 = 整数 注释 = "嵌入式封装" 折叠 @嵌入式方法 = "">
参数 cp <类型 = 文本型>
{
    @ (INT)::inet_addr (GetMbsText(@<cp>.GetText(), CVolMem(), NULL))
}

方法 SendARP2 <公开 静态 类型 = 整数 注释 = "嵌入式封装" 折叠 @嵌入式方法 = "" @视窗.外部头文件 = "iphlpapi.h"
      @视窗.外部库 = "Iphlpapi.lib">
参数 DestIP <类型 = 整数>
参数 SrcIP <类型 = 整数 @默认值 = 0>
参数 pMacAddr <类型 = "字节 []" 注释 = "至少8个字节" @需求类型 = 可写入变量>
参数 PhyAddrLen <类型 = 整数 注释 = "必须提供整数变量" @需求类型 = 可写入变量>
{
    @ (INT)::SendARP((IPAddr)@<DestIP>, (IPAddr)@<SrcIP>, &@<pMacAddr>, (PULONG)&@<PhyAddrLen>)
}

创世魂 发表于 2023-11-1 22:05:06

火山里面表格调用dll不能直接用文本型,因为不通用。。火山的文本型是自己包装的。需要走变整数,通过指针获取。。

可以简单参考一下这个:https://doc.voldp.com/e_To_vol/structure.html#DLL   介绍了一点点文本型的使用。

飞丶宇 发表于 2023-11-2 00:56:57

创世魂 发表于 2023-11-1 22:05
火山里面表格调用dll不能直接用文本型,因为不通用。。火山的文本型是自己包装的。需要走变整数,通过指针 ...

但是看完文档感觉更麻烦了:噜阿噜

(在火山中DLL命令的定义更加灵活,随便建立一个方法都可以用来表示一个DLL命令。)
页: [1]
查看完整版本: 获取MAC的API在火山PC运行报错,怎么解决字节数组传址?