VFP封装结构类型示例(三)
相关贴:https://bbs.bccn.net/thread-508553-1-1.html
https://bbs.bccn.net/thread-508669-1-1.html
前一贴探讨了VFP封装结构类型结构体的嵌套问题,示例中描述了如何操作结构体中的其他结构成员数据。
其中:
nm = CREATEOBJECT("NMHDR")
of = CREATEOBJECT("OFNOTIFYA")
nm.setValue("code", 123, of.getMemberAddr("hdr"))
这句是使用 NMHDR 结构类的 setValue 方法来设置 OFNOTIFYA 结构类 hdr 成员的 code 属性值。OFNOTIFYA 结构类的 hdr 成员是一个 NMHDR 结构类。
nm.getValue("code", of.getMemberAddr("hdr"))
这句是使用 NMHDR 结构类的 getValue 方法来获取 OFNOTIFYA 结构类 hdr 成的员 code 属性值。
STRUCT_CLASS 类的 getMemberAddr() 方法是用来获取结构成员的地址。
of.getMemberAddr("hdr") 就是获取 OFNOTIFYA 结构类 hdr 成的员的地址,这个地址也就是 OFNOTIFYA 结构体中 NMHDR 结构成员(hdr)的地址。
可见,只要能得到某结构类数据的首地址,就可以用这个结构类型的方法读写该类型的类成员数据。
下面用示例探讨一下结构类在VFP的应用:如何处理函数返回的不同的结构类数据。
这个问题在调用 Windows API 也是时常会遇到,就是函数返回的数据是因情况不同而返回不同的结构数据。调用该函数时就要考虑什么情况用什么结构的处理方法来获取该函数返回的数据。
采取的方法是分配一个足够大的临时缓存区,作为函数的(in/out)参数,函数通过他来存放不同结构类型的数据返回给调用者。调用者就可以根据函数返回的状态标志,采取相应的结构类方法获取函数返回的数据处理结果。
相关文件打包
StructClass_demo.rar
(7.58 KB)
程序代码:
cDefPath = ADDBS(JUSTPATH(SYS(16))) SET DEFAULT TO (cDefPath) #INCLUDE apiFuns.h SET PROCEDURE TO apiFuns.prg, StructClass.prg ADDITIVE LoadApi() st1 = CREATEOBJECT("STRUCT_1") st2 = CREATEOBJECT("STRUCT_2") mem = CREATEOBJECT("MEMORY") nBufSize = MAX(st1.size, st2.size) && 要足够大 pBuffer = mem.malloc(nBufSize) && 临时缓存 IF fun(pBuffer, nBufSize) == 1 ? "aa = "+ TRANSFORM(st1.getValue("aa", pBuffer)) ELSE ? "bb = "+ TRANSFORM(st2.getValue("bb", pBuffer)) ? "cc = "+ TRANSFORM(st2.getValue("cc", pBuffer)) ENDIF SET PROCEDURE TO CLEAR ALL RETURN FUNCTION fun(pBuffer, nBufSize) LOCAL st1,st2 st1 = CREATEOBJECT("STRUCT_1") st2 = CREATEOBJECT("STRUCT_2") n = INT(2*RAND()+1) && 随机 1 or 2 IF n == 1 st1.setValue("aa", 123) apiMemcpy_s(pBuffer, nBufSize, st1.addr, st1.size) ELSE st2.setValue("bb", 456) st2.setValue("cc", 789) apiMemcpy_s(pBuffer, nBufSize, st2.addr, st2.size) ENDIF RETURN n ENDFUNC DEFINE CLASS STRUCT_1 as STRUCT_CLASS PROCEDURE init DIMENSION this.aSTRUCT[1,4] this.stInit(1, "aa", "I",4) STRUCT_CLASS::init ENDPROC ENDDEFINE DEFINE CLASS STRUCT_2 as STRUCT_CLASS PROCEDURE init DIMENSION this.aSTRUCT[2,4] this.stInit(1, "bb", "I",4) this.stInit(2, "cc", "I",4) STRUCT_CLASS::init ENDPROC ENDDEFINE