用户自定义类型(User-defined   Type)参数的传递  
   
    用户自定义类型在VB中是一种重要的数据类型,它为编程者提供了很大的灵活性,使开发人员可以根据需要构造自己的数据结构。它相当于C/C++中的结构类型(structure)。在VB中,允许程序员以传址的方式将自定义数据类型参数传入动态库,DLL过程也可以将修改后的参数返回VB程序。但是,在VB中仍然不支持以传值的方式传递用户自定义类型参数。  
   
    传递用户自定义类型参数时,必须确保VB中的数据类型的成员与动态库中的结构成员是一一对应的,所占空间也必须严格一致。这里所说的一一对应,不仅是指VB   中的所有结构成员在动态库的结构中都必须有对应的元素,而且它们在数据结构中定义的顺序也必须严格一致,这是VB中使用的"数据结构成员对齐方式"决定的。在VB   中,数据结构使用双字对齐方式(4-byte   alignment),因此,在用户自己生成用于VB   调用的动态连接库时,也必须把编译选项"structure   member   alignment"   设为4字节(如前文所述)。  
   
    所谓结构成员对齐方式是指一个数据结构内部,其成员的排列方式。譬如,在VB中,其对齐方式是4字节,这就好象在一个数据结构内部分成了很多个4字节大小的小单元,如果相邻   两个或多个数据成员的大小可以放在一个单元中,那么就放在一起;否则这些小单元中可能   会出现未用的空字节。我们来看下面一个数据类型:  
   
   
  Type   TestType  
  m1   as   Integer  
  m2   as   Byte  
  m3   as   Long  
  End   Type    
   
   
    它的三个成员的大小加起来是2+1+4=7。但是,由于m1和m2的字节总长度是3,小于4,它   们就存放于一个单元中;但该单元剩下的一个字节不足以放下一个Long型的成员m3,于是m3   就被放在下一个单元中,它们之间就有了一个未用的空字节;因此,整个结构所占实际长度是8   字节。同理,如果将m3和m2的位置交换一下,它所占的尺寸就变成了9字节。可见,成员在结构   中的声明顺序也是非常重要的。  
   
    通常,当一个用户自定义类型中不包含字符串时,向动态连接库中传递该类型的参数是没有什么问题的。如果只传递一个自定义类型变量,则既可以传递该变量名,也可以传递该变   量的第一个成员,它们的效果是一样的,都是将该变量的地址传进了动态库;同样,如果要传递一个自定义类型的数组,则既可以传递该数组的第一个元素,也可以传递第一个元素的第一个成员。但是,如果用户自定义类型中包含字符串类型时,又该如何与动态连接库传递参数呢?答案是令人遗憾的:在VB中,你无法将一个包含字符串成员的用户自定义类型变量或数   组安全、正确地传入动态库中。如果你这样做了,即使某次侥幸得到了正确的结果,在其背后也隐藏着许多致命的危险。因此,如果一定要在用户自定义类型中包含字符串变量,并且该类型的变量又要作为参数传入动态库时,你最好修改类型定义,把其中的字符串成员用相应的字节数组类型替换掉(转换方法可参见前文),这样就可以在VB   和动态库间传递这种类型的参数了。  
   
    另外,在VB   中还可以把一个函数的指针传递到动态库中,方法也并不复杂。但笔者强烈建议最好不要这么做,因为这样一来VB   应用程序就几乎完全丧失了它所应有的安全性。如果   确实需要传递函数指针的话,那么还是编一个C/C++   的程序来完成这项工作吧。  
   
    总之,在VB中调用DLL过程是一个比较复杂的问题,编程人员必须很好地把握,才能达到既提高了程序效率,开拓了程序功能,又不降低程序安全性的目的。另外需要特别指出的一点是,在本文中提到的所有动态连接库,都是指没有使用自动化(OLE   Automation)技术的动态库,Windows   API和大多数用户自编的动态连接库都是这种类型的。对于使用了OLE   Automation技术的动态连接库,其参数传递的方式有所不同,读者可以参阅有关OLE   技术的书籍,在此不再涉及。

用户自定义类型(User-defined Type)参数的传递相关推荐

  1. SpringMVC参数的传递——接收List数组类型的数据

    前言 本文主要是记录SpringMVC中当前台传过来数组的时候,如何把前台传过来的数据封装到Controller层方法的形参中. 在了解下面参数如何传递前先记住两个结论: 当Ajax以applicat ...

  2. r语言之散点图类型type参数

    type参数用来控制所生成散点图的类型,有如下几个选项: type="p"表示绘制单独的点 type="l"表示绘制点连成的折线 type="b&qu ...

  3. R语言使用plot函数可视化数据、使用type参数自定义设置可视化的类型(数据点和线关系的类型)、设置type参数为s则为阶梯状显示

    R语言使用plot函数可视化数据.使用type参数自定义设置可视化的类型(数据点和线关系的类型).设置type参数为s则为阶梯状显示 目录

  4. R语言使用plot函数和lines函数可视化多条折线图(线图、line charts)进行对比分析、设置type参数自定义线条和点的关系、设置lty设置线条类型、col设置颜色、pch设置点形状等

    R语言使用plot函数和lines函数可视化多条折线图(线图.line charts)进行对比分析.设置type参数自定义线条和点的关系.设置lty设置线条类型.col设置颜色.pch设置点形状.lw ...

  5. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  6. js函数中参数的传递

    先看一道JS的笔试题: var setObj=function(o){o.name="xiaoming";o={};o.name="xiaohong"; } v ...

  7. 【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)

    Spring 注入(Injection) 什么是注入? 为什么要注入? 如何进行注入[开发步骤] Spring注入的原理分析(简易版) Set注入详解 JDK内置类型 String+8种基本类型 数组 ...

  8. properties解耦数据库参数和SQL参数的传递

    在往常连接数据库中,我使用工具类封装数据库的连接工具,在db.properties中配置数据库的相关参数,在工具类中用properties流来读取配置,那么在MyBatis中是否有相同的方法来解耦xm ...

  9. Scala之类型参数化:Type Parameterization

    Scala之类型参数化:Type Parameterization 本文原文出处: http://blog.csdn.net/bluishglc/article/details/52584401 严禁 ...

最新文章

  1. SharePoint 检测页面编辑模式
  2. 剑指 offer set 26 不用加减乘除做加法
  3. Ruby Fiber指南(三)过滤器
  4. 翻翻git之---溜的飞起的载入效果AVLoadingIndicatorView
  5. 卫星导航 | 整秒转时分秒(时间转换)
  6. (转)[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)...
  7. 手把手教你玩转ARP包(四)
  8. mkfs.jffs2参数详解
  9. Hive 老当益庄 | 深度解读 Flink 1.11:流批一体 Hive 数仓
  10. 不藏了,这些Java反射用法总结都告诉你们
  11. (转)Hibernate框架基础——cascade属性
  12. 读写分离方案_项目读写分离方案
  13. NYOJ--13--Fibonacci数
  14. 从来都是少数决定多数
  15. matlab中mapminmax()函数的用法
  16. 锐捷云教室 服务器型号,锐捷智慧云课堂方案(云教室+简单)优秀课件
  17. linux csr蓝牙驱动,佳能 CSR BlueCore Bluetooth 驱动程序下载-更新佳能软件(蓝牙)
  18. 团队作业8----第二次项目冲刺(Beta阶段) 第五天
  19. 阿里云python中文社区_一文详解如何用 python 做中文分词-阿里云开发者社区
  20. Elasticsearch:运用 Pinned query 来提升特定的结果

热门文章

  1. Java微信公众号开发面试题
  2. Java IO流之普通文件流和随机读写流区别
  3. Android中绘制圆形和圆角图片
  4. java区分不同的excel_Java处理excel两种不同的方式
  5. 这份思科设备命令大全火了~
  6. 【全球年青人召集令】Hello World,Hello 2050
  7. 重磅 | 阿里开源首个 Serverless 开发者平台 Serverless Devs
  8. 如何无缝迁移 SpringCloud/Dubbo 应用到 Serverless 架构
  9. 初探云原生应用管理之:聊聊 Tekton 项目
  10. hive 指定字段插入数据_Hive 表之间数据处理,Int 类型字段部分字段出现 NULL情况...