递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 151|回复: 4
打印 上一主题 下一主题

[类库封装] dll初始化成功,无法正确获取结构体成员,求大佬指点

[复制链接]

51

主题

169

帖子

2322

积分

金牌会员

Rank: 6Rank: 6

积分
2322
跳转到指定楼层
楼主
发表于 3 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<火山程序 类型 = "通常" 版本 = 1 />

方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "当按钮被单击后发送此事件">
参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
{
    如果 (来源对象 == 按钮1)
    {
        变量 详细表 <类型 = 流量统计类>
        变量 mib表 <类型 = MIB_IF_TABLE2>
        变量 表地址 <类型 = 变整数>
        变量 获取数组 <类型 = 结构体数组类>

        调试输出 (流量统计类.获取网卡接口信息 (mib表))

        调试输出 (mib表.NumEntries)
        调试输出 (mib表.Table.为指定对象类 (MIB_IF_ROW2))
        调试输出 (mib表.Table.取成员数 ())

    }
    返回 (0)
}

类 流量统计类 <公开>
{
    方法 获取网卡接口信息 <公开 静态 类型 = 变整数 注释 = "常见返回值:" 注释 = "NO_ERROR (0):函数调用成功。Table 参数现在指向包含接口信息的有效数据。"
            注释 = "ERROR_NOT_ENOUGH_MEMORY (8):内存不足,无法分配存储表的缓冲区。"
            注释 = "ERROR_NOT_SUPPORTED (50):当前操作系统不支持此函数(GetIfTable2 需要 Windows Vista 或更高版本)。"
            注释 = "ERROR_INVALID_PARAMETER (87):参数无效(例如传入了空指针)。"
            注释 = "ERROR_NOT_FOUND (1168):未找到元素(通常不太可能,因为至少会有一个回环接口)。" @输出名 = "GetIfTable2"
            @视窗.输入 = "Iphlpapi.dll">
    参数 table <类型 = MIB_IF_TABLE2 @视窗.输出参数 = 真>
    {

    }
}

类 结构体数组类 <公开 基础类 = 对象数组模板类 @模板实现类 = "MIB_IF_ROW2">
{

    #
}

类 MIB_IF_ROW2 <公开 基础类 = 结构体数组类 @视窗.结构类 = 0>
{
    变量 InterfaceIndex <类型 = 变整数>
    变量 Description <类型 = 变整数>
    变量 InOctets <类型 = 长整数>
    变量 OutOctets <类型 = 长整数>

    #
}

#     
#

类 MIB_IF_TABLE2 <公开 @视窗.结构类 = 0>
{
    变量 NumEntries <公开 类型 = 变整数 注释 = "接口数量">
    变量 Table <公开 类型 = MIB_IF_ROW2 注释 = "接口数组指针" "">

    #
    #
    #
    #
}


回复

使用道具 举报

29

主题

2492

帖子

8848

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
8848
沙发
发表于 3 天前 | 只看该作者
<火山程序 类型 = "通常" 版本 = 1 />

类 流量统计类 <公开 折叠 @视窗.预定义宏 = "_WIN32_WINNT=0x600" @视窗.外部头文件 = "Iphlpapi.h" @视窗.外部库 = "Iphlpapi.lib">
{
    方法 获取网卡接口信息 <公开 静态 类型 = 整数 折叠 @嵌入式方法 = "">
    参数 table <类型 = MIB_IF_TABLE2指针>
    {
        @ GetIfTable2(&@<table>)
    }
}

类 MIB_IF_ROW2 <公开 注释 = "成员太多了,只封一部分"
        注释 = "https://learn.microsoft.com/zh-cn/windows/win32/api/netioapi/ns-netioapi-mib_if_row2" 折叠
        @别名 = "MIB_IF_ROW2" @别名类型 = 本地结构>
{
    变量 InterfaceIndex <公开 类型 = 整数 @输出名 = "InterfaceIndex">
    变量 Description <公开 类型 = 文本指针 @输出名 = "Description">
    变量 InOctets <公开 类型 = 长整数 @输出名 = "InOctets">
    变量 OutOctets <公开 类型 = 长整数 @输出名 = "OutOctets">
}

类 MIB_IF_TABLE2指针 <公开 折叠 @别名 = "PMIB_IF_TABLE2" @别名类型 = 本地参考类型>
{
    变量 成员数 <公开 类型 = 整数 注释 = "接口数量" @输出名 = "NumEntries">

    方法 销毁 <公开 静态 注释 = "不再使用时必须调用此方法释放内存" 折叠 @嵌入式方法 = "">
    参数 本结构指针 <类型 = MIB_IF_TABLE2指针>
    {
        @ FreeMibTable(@<本结构指针>)
    }

    方法 取成员 <公开 静态 类型 = MIB_IF_ROW2 折叠 @嵌入式方法 = "">
    参数 本结构指针 <类型 = MIB_IF_TABLE2指针>
    参数 索引 <@匹配类型 = 通用整数型>
    {
        @ @<本结构指针>->Table[@<索引>]
    }

    方法 枚举循环 <公开 静态 折叠 @嵌入式方法 = "name = mib_counter\r\nhas_loop_body = true">
    参数 本结构指针 <类型 = MIB_IF_TABLE2指针>
    {
        @ for (ULONG __mib_if_table2_itr = 0; __mib_if_table2_itr < @<本结构指针>->NumEntries; __mib_if_table2_itr++)
    }

    方法 取枚举值 <公开 静态 类型 = MIB_IF_ROW2 折叠 @嵌入式方法 = "parent = mib_counter">
    参数 本结构指针 <类型 = MIB_IF_TABLE2指针>
    {
        @ @<本结构指针>->Table[__mib_if_table2_itr]
    }
}

类 例程 <折叠>
{
    方法 例子 <公开 静态>
    {
        变量 MIB <类型 = MIB_IF_TABLE2指针>
        如果 (流量统计类.获取网卡接口信息 (MIB) == 0)
        {
            MIB.枚举循环 ()
            {
                调试输出 (MIB.取枚举值 ().InterfaceIndex, MIB.取枚举值 ().Description.取文本 (), MIB.取枚举值 ().InOctets, MIB.取枚举值 ().OutOctets)
            }
            MIB.销毁 ()

        }

    }
}
回复

使用道具 举报

51

主题

169

帖子

2322

积分

金牌会员

Rank: 6Rank: 6

积分
2322
板凳
 楼主| 发表于 3 天前 | 只看该作者
Xelloss0618 发表于 2025-9-15 10:02
类 流量统计类
{
    方法 获取网卡接口信息

   X大佬,有没有非嵌入式的,嵌入式实在学不会,我发的那种应该怎么改
回复

使用道具 举报

29

主题

2492

帖子

8848

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
8848
地板
发表于 3 天前 | 只看该作者
kanshijian 发表于 2025-9-15 10:20
X大佬,有没有非嵌入式的,嵌入式实在学不会,我发的那种应该怎么改

没法改,这个还是嵌入式方法最简单。
MIB_IF_ROW2这个结构体太复杂了,你要用结构类必须把它的全部成员都封装出来,而且每个类型的尺寸不能错。
回复

使用道具 举报

51

主题

169

帖子

2322

积分

金牌会员

Rank: 6Rank: 6

积分
2322
5#
 楼主| 发表于 3 天前 | 只看该作者
Xelloss0618 发表于 2025-9-15 10:33
没法改,这个还是嵌入式方法最简单。
MIB_IF_ROW2这个结构体太复杂了,你要用结构类必须把它的全部成员都 ...

谢谢提供的思路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-9-18 03:14 , Processed in 0.080552 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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