递归火山软件开发平台

标题: 获取MAC的API在火山PC运行报错,怎么解决字节数组传址? [打印本页]

作者: assume2013    时间: 2023-10-31 21:39
标题: 获取MAC的API在火山PC运行报错,怎么解决字节数组传址?
本帖最后由 assume2013 于 2023-10-31 21:45 编辑


在火山PC的通信测试里没找到根据IP地址获取到MAC的方法,在易语言源码找到获取MAC的源码,都不懂怎么搬到火山?求大佬指点

一个简单的inet_addr  API在易语言声明如下:

运行正常,而我在火山PC声明如下:

运行却报错, 不懂为什么报错?

还如一个函数API在易语言声明如下:

我在火山这样声明:


对于这样的字节型数组,火山PC应该怎么传址?

易语言的获取MAC方法调用如下图:


这就是根据IP获取方法,在火山PC怎么实现,非常多谢各位大佬。




作者: Xelloss0618    时间: 2023-11-1 20:52
本帖最后由 Xelloss0618 于 2023-11-1 22:54 编辑

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

方法 IP取MAC地址 <公开 静态 类型 = 文本型 注释 = "表格DLL写法" 折叠>
参数 IP地址 <类型 = 文本型>
{
    变量 MacAddr <类型 = "字节 [8]">
    变量 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 <类型 = "字节 [8]">
    变量 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
火山里面表格调用dll不能直接用文本型,因为不通用。。火山的文本型是自己包装的。需要走变整数,通过指针获取。。

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

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

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

(在火山中DLL命令的定义更加灵活,随便建立一个方法都可以用来表示一个DLL命令。)




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4