火山软件开发平台

标题: 有关c++结构的封装示例: [打印本页]

作者: 飞扬工作室    时间: 2023-7-18 17:24
标题: 有关c++结构的封装示例:
下面的程序演示了如何定义封装C++结构,以及如何封装内嵌结构,及内嵌结构数组:

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

类 PROCESSENTRY32 <公开 @视窗.结构类 = 0>
{
    变量 dwSize <公开 类型 = 整数>
    变量 cntUsage <公开 类型 = 整数>
    变量 th32ProcessID <公开 类型 = 整数>
    变量 th32DefaultHeapID <公开 类型 = 变整数>
    变量 th32ModuleID <公开 类型 = 整数>
    变量 cntThreads <公开 类型 = 整数>
    变量 th32ParentProcessID <公开 类型 = 整数>
    变量 pcPriClassBase <公开 类型 = 整数>
    变量 dwFlags <公开 类型 = 整数>
    变量 szExeFile <公开 类型 = "短整数 [260]" 注释 = "如果是A版本API使用,此处需要将\"短整数\"改成\"字节\".">
    变量 ""
    变量 成员2 <公开 类型 = 结构2 注释 = "内嵌结构">
    变量 成员3 <公开 类型 = "结构2 [100]" 注释 = "内嵌结构数组">
}

类 结构2 <公开 @视窗.结构类 = 0>
{
    变量 dwSize <公开 类型 = 整数>
    变量 cntUsage <公开 类型 = 整数>
    变量 成员2 <公开 类型 = 结构3>
}

类 结构3 <公开 @视窗.结构类 = 0>
{
    变量 dwSize <公开 类型 = 整数>
    变量 cntUsage <公开 类型 = 整数>
}


作者: 15930887162    时间: 2023-7-18 18:07
沙发。。。。。
作者: 呵呵仙8    时间: 2023-7-18 18:11
原来如此,都支持复制,粘贴多行代码了?
作者: voldev.    时间: 2023-7-18 18:18
前排留名
作者: 大有可为    时间: 2023-7-18 19:02
呵呵仙8 发表于 2023-7-18 18:11
原来如此,都支持复制,粘贴多行代码了?

已经支持了
作者: numbersir    时间: 2023-7-19 07:26
结构嵌套封装例子
作者: 明靓    时间: 2023-7-19 07:37
呵呵仙8 发表于 2023-7-18 18:11
原来如此,都支持复制,粘贴多行代码了?

你才发现啊,哈哈哈
作者: 折戟沉沙    时间: 2023-7-19 11:31

typedef struct _RTL_PROCESS_MODULE_INFORMATION {
HANDLE Section; // Not filled in
PVOID MappedBase;
PVOID ImageBase;
ULONG ImageSize;
ULONG Flags;
USHORT LoadOrderIndex;
USHORT InitOrderIndex;
USHORT LoadCount;
USHORT OffsetToFileName;
UCHAR FullPathName[256];
} RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;


typedef struct _RTL_PROCESS_MODULES {
ULONG NumberOfModules;
RTL_PROCESS_MODULE_INFORMATION Modules[1];
} RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES;



吴总,这种结构体呢,Modules[],这个是未知长度,需要通过NumberOfModules才知道。


(, 下载次数: 34)


这是我自己内嵌写的,如何用火山来表达?



作者: dengzf    时间: 2023-7-19 13:43
本帖最后由 dengzf 于 2023-7-19 15:31 编辑

火山的 @视窗.结构类 中不支持使用文本型, 如何处理? 用指针吗下面这种呢?
另外 下面这些如何在火山语法中实现?
#define MAX_SPINDLE     24    这个宏的值是根据系统加载环境不同, 自动判断加载哪一个的 , 它的值 4, 8 ,24
typedef struct odbact2 {
         short        datano;                /* spindle number */
         short        type;                /* dummy */
         long        data[MAX_SPINDLE];        /* spindle data */
} ODBACT2 ;


还有这种, 宏值* 数值 的数组  MAX_AXIS 也是一个条件变化的宏, 8 12 48 96这样
/* cnc_rdzofsr64:read work zero offset value(area specified) */
typedef struct iodbzor64 {
    short       datano_s;           /* start offset number */
    short       type;               /* axis number */
    short       datano_e;           /* end offset number */
    short       dummy;              /* dummy */
    REALDATA    data[MAX_AXIS*8];   /* offset value */  宏值* 数值 的数组
} IODBZOR64; /* In case that the number of axes is MAX_AXIS, the number of data is 7 */



作者: 飞扬工作室    时间: 2023-7-19 16:36
折戟沉沙 发表于 2023-7-19 11:31
typedef struct _RTL_PROCESS_MODULE_INFORMATION {
HANDLE Section; // Not filled in
PVOID MappedBase;

这种内嵌可变的,用字节集配合结构的S类型把.
作者: 飞扬工作室    时间: 2023-7-19 16:37
dengzf 发表于 2023-7-19 13:43
火山的 @视窗.结构类 中不支持使用文本型, 如何处理? 用指针吗下面这种呢?
另外 下面这些如何在火山语法中 ...

一样封一个,配合编译条件使用.
作者: dengzf    时间: 2023-7-19 17:10
飞扬工作室 发表于 2023-7-19 16:37
一样封一个,配合编译条件使用.

视窗.结构体 中不支持 文本型与其它类型,, 这要如何搞法才好?, 易语言中结构支持文本型, 用起来简单
作者: 飞扬工作室    时间: 2023-7-19 17:56
dengzf 发表于 2023-7-19 17:10
视窗.结构体 中不支持 文本型与其它类型,, 这要如何搞法才好?, 易语言中结构支持文本型, 用起来简单 ...

文本型在结构类中使用变整数,传递文本数据时传递文本指针过去: 取文本指针 (文本数据)
下一版中会直接支持文本型
作者: 呵呵仙8    时间: 2023-7-19 18:47
本帖最后由 呵呵仙8 于 2023-7-19 18:50 编辑
飞扬工作室 发表于 2023-7-19 17:56
文本型在结构类中使用变整数,传递文本数据时传递文本指针过去: 取文本指针 (文本数据)
下一版中会直接支 ...

的确应该有易语言的文本型结构,字节集结构,单精度小数。这样才能让易用户更好的转用火山。
作者: dengzf    时间: 2023-7-19 19:38
呵呵仙8 发表于 2023-7-19 18:47
的确应该有易语言的文本型结构,字节集结构,单精度小数。这样才能让易用户更好的转用火山。 ...

确实如此
作者: Xelloss0618    时间: 2023-7-19 20:51
飞扬工作室 发表于 2023-7-19 17:56
文本型在结构类中使用变整数,传递文本数据时传递文本指针过去: 取文本指针 (文本数据)
下一版中会直接支 ...

建议用表格封装 API 的时候,如果文本型参数是空对象,就传 NULL。
因为很多 API 的文本指针参数是需要用到 NULL 的,现在封装这种 API 都只能用变整数,而不能用文本型
作者: 飞扬工作室    时间: 2023-7-19 21:14
呵呵仙8 发表于 2023-7-19 18:47
的确应该有易语言的文本型结构,字节集结构,单精度小数。这样才能让易用户更好的转用火山。 ...

单精度小数使用"@视窗.单精度小数"属性定义一下对应成员即可
作者: 008    时间: 2023-7-19 21:47
6666666666666
作者: dengzf    时间: 2023-7-19 22:07
本帖最后由 dengzf 于 2023-7-19 22:18 编辑
飞扬工作室 发表于 2023-7-19 21:14
单精度小数使用"@视窗.单精度小数"属性定义一下对应成员即可

结构体中也不支持这种 模板数组类  自定义与基本数组类都不支持,  上面发的结构体中的不明确个数的数组[]
可以用c++代码将对应 数组[?] 的值 用加入成员到 模板数组类接收到火山的表格中来,这样比生成多个类同的结构体要省事

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

类 REALDATA <公开 注释 = "" @视窗.结构类 = 0>
{
    变量 val <公开 类型 = 小数 注释 = " data value" @输出名 = "val">
    变量 dec <公开 类型 = 长整数 注释 = " decimal point" @输出名 = "dec">
    变量 dummy <公开 类型 = 长整数 注释 = "" @输出名 = "dummy">
}

类 REALDATA数组类 <公开 基础类 = 对象数组模板类 @模板实现类 = "REALDATA">

#

类 IDBWRA64 <公开 注释 = " /* cnc_prstwkcd64:preset work coordinate */" @视窗.结构类 = 0>
{
    变量 datano <公开 类型 = 小数 注释 = " dummy" @输出名 = "datano">
    变量 type <公开 类型 = 长整数 注释 = " axis number" @输出名 = "type">
    变量 dummy <公开 类型 = 长整数 注释 = " dummy2" @输出名 = "dummy">
    变量 data <公开 类型 = REALDATA数组类 注释 = "preset data  MAX_AXIS 数组维数 4 32 48 72 96" @输出名 = "data">
}
作者: fengyishen    时间: 2023-7-22 03:05
(, 下载次数: 19)
吴总,请问这种结构体有办法用表格封装吗?

作者: 暴风    时间: 2023-7-22 08:35
  1. struct PathSegmentData
  2. {
  3.     bool IsBezier;
  4.     std::vector<D2D1_POINT_2F> Points;          // for IsBezier == false
  5.     std::vector<D2D1_BEZIER_SEGMENT> Beziers;   // for IsBezier == true
  6. };

  7. struct PathFigureData
  8. {
  9.     D2D1_POINT_2F StartPoint;
  10.     D2D1_FIGURE_BEGIN FigureBegin;
  11.     D2D1_FIGURE_END FigureEnd;
  12.     std::vector<PathSegmentData> Segments;
  13. };
复制代码
这个结构能搞吗

作者: 飞扬工作室    时间: 2023-7-22 09:44
fengyishen 发表于 2023-7-22 03:05
吴总,请问这种结构体有办法用表格封装吗?

句柄和指针全用变整数,RECT用矩形类,DWORD和UINT用整数.
作者: 飞扬工作室    时间: 2023-7-22 09:45
暴风 发表于 2023-7-22 08:35
这个结构能搞吗

这个里面包含动态数组类对象,只能嵌入解决.
作者: zmfree    时间: 2023-7-22 10:32
我以为是直接写c代码的结构休代码!!!

作者: fengyishen    时间: 2023-7-22 16:02
飞扬工作室 发表于 2023-7-22 09:44
句柄和指针全用变整数,RECT用矩形类,DWORD和UINT用整数.

重点是想问嵌套的自定义结构构,嵌套的结构指针,这两个的写法
作者: 飞扬工作室    时间: 2023-7-22 17:00
fengyishen 发表于 2023-7-22 16:02
重点是想问嵌套的自定义结构构,嵌套的结构指针,这两个的写法

嵌套的自定义结构: 你定义一个对应的结构类,直接使用该结构类作为数据类型就行了,譬如"矩形类".
嵌套的自定义结构指针: 所有指针都是变整数
作者: mxbczs    时间: 2023-7-23 08:31
支持!!
作者: 暴风    时间: 2023-7-25 13:10
看到更新了结构类, 现在是否支持
  1. struct PathSegmentData
  2. {
  3.     bool IsBezier;
  4.     std::vector<D2D1_POINT_2F> Points;          // for IsBezier == false
  5.     std::vector<D2D1_BEZIER_SEGMENT> Beziers;   // for IsBezier == true
  6. };

  7. struct PathFigureData
  8. {
  9.     D2D1_POINT_2F StartPoint;
  10.     D2D1_FIGURE_BEGIN FigureBegin;
  11.     D2D1_FIGURE_END FigureEnd;
  12.     std::vector<PathSegmentData> Segments;
  13. };
复制代码



作者: 飞扬工作室    时间: 2023-7-25 13:36
暴风 发表于 2023-7-25 13:10
看到更新了结构类, 现在是否支持

用第一种方式: 结构基础类
作者: server    时间: 2023-7-25 16:27
变量 szExeFile <公开 类型 = "短整数 [260]" 注释 = "如果是A版本API使用,此处需要将\"短整数\"改成\"字节\".">

给个属性,自动跟随编译位数而变化呢??
作者: 飞扬工作室    时间: 2023-7-25 18:02
server 发表于 2023-7-25 16:27
变量 szExeFile

给个属性,自动跟随编译位数而变化呢??

现在都是用 W 版,A版本很少用了




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