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

2023-11-01

用户自定义类型(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   技术的书籍,在此不再涉及。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 将元素与窗口底部对齐,但允许滚动到下方的内容

    我现在正在编写一个 jquery 滑块 并将宽度设置为 100 并且无论窗口如何调整大小 我都希望它与窗口底部对齐 我已经找到了让它在向下滚动时一直粘在底部的方法 但我不希望这样 我希望能够滚动到此滑块下方以获取更多内容 这个网站展示了我正
  • 如何将文本输入与图像按钮对齐?

    我有一个表单 其中输入字段的最后一行后面跟着 2 个图像按钮 无论我尝试什么 我似乎都无法将按钮与字段水平对齐 这是所有代码 http jsfiddle net h3ZPk http jsfiddle net h3ZPk 添加此规则 but
  • 如何强制内联块 div 达到相同高度

    我有像网格一样的内联块 div 我想强迫所有在同一行的人达到相同的高度 他们应该得到最长的div的高度 CSS jquery 或简单的 javascript 解决方案会很棒 现在这很常见 我去看了Masonry 但据我对示例图形的理解 它并
  • 是否可以水平居中对齐一排加起来不等于 12 的 Bootstrap Span?

    div class row div class span4 div div class span4 div div 据我了解 您总共需要 12 个跨度 有没有办法仍然使我的两个跨度水平居中对齐 上面的内容只会向左浮动 我尝试在它们周围放置一
  • java swing布局两个组件

    A B
  • 具有相同 crs、范围、维度、分辨率的栅格不对齐

    我正在查找枫糖浆每年的平均生产天数 我的 Maple 分布数据位于 ascii 文件中 我有一个名为的栅格 从 NetCDF 文件创建 brick Tmax 我想要匹配的规格brick Tmax我的枫树分布数据 These are the
  • mysql从两个表和不同结构中选择数据

    你好 我正在用 php mysql 建立一种议程 网站 该议程包含按日期排序的公共事件和用户个人笔记 我需要加载数据库中事件表中的所有事件以及注释表中的注释 但这两个表具有完全不同的结构 并且它们只有一个相同的字段 DATETIME 那么我
  • LLVM 的 amd64 输出中向量的对齐

    我正在尝试通过 LLVM 在结构内部使用向量 我的结构有以下 C 定义 struct Foo uint32 t len uint32 t data 32 attribute aligned 16 下面是一些 LLVM 代码 用于将 42 添
  • 在闪亮的主面板中右对齐元素

    我有一个闪亮的应用程序 左侧有一个侧边栏 我想将 mainPanel 中的绘图向右对齐 我尝试过添加style align right mainPanel 中的每个元素 以及包装我能想到的所有内容div style align right
  • PHP 的项目结构

    我是 PHP 新手 想了解 php 项目的目录结构 我有Java方面的经验 在java中我们有src包含java源文件 WEB INF包含lib和jsp页面 PHP 中有类似的标准目录结构吗 我们在 php 中也有分层吗 就像我们在 jav
  • 如何构建 iPhone Xcode 项目?

    建立组 文件夹的好方法是什么 我已经尝试通过功能 功能加模型等的用户界面 与一个共同的组 我也尝试过UI 模型等 前者将类似的东西放在一起 这非常适合 iPhone 范式 后者意味着我会跳得更多 你怎么认为 标准的 Xcode MVC 文件
  • 结构体指针数组

    我试图了解我的代码是否正确 我需要声明一个指向结构的指针数组 创建一个新结构并分配值并打印它们 在我看来 我没有正确声明指针数组 我需要知道我做错了什么 谢谢 我收到此编译错误 错误 people 未声明 首次在此函数中使用 我尝试插入 s
  • 垂直对齐:基线在 Chrome 中不起作用

    老实说 我有一个非常愚蠢的问题 不管怎样 就到这里吧 我一直在尝试使用垂直对齐 基线 这本身就起作用 问题是它可以在 IE 和 Firefox 中运行 我的问题是 由于某些奇怪的原因 它在 Chrome 中不起作用 chrome 中问题的屏
  • 使 td 固定大小(宽度,高度),而其余 td 可以扩展

    您知道如何固定表格中 td 宽度和高度的大小 从而允许表格上的其余 td 根据需要扩展吗 问题是 当 td 内部有数据时 它不会比数据缩小得更多 但如果为空 它会一直缩小 如果扩大窗口 td 也会扩大 我想保留 td 的大小 无论您扩展还是
  • 带有自定义 json 数据的 JsTree

    我在 json 中有这个结构 无法根据请求进行修改 Object url http www google com id 1 name Redirection Rule Object frequency 1 trigger 1 Object
  • 计算 QR 码对齐图案的位置

    我需要知道如何计算 QR 码对齐图案的位置 如中定义ISO IEC 18004 2000 附录 E 表 http www arscreatio com repositorio images n 23 SC031 N 1915 18004Te
  • 如何左对齐 Angular Material 拉伸 md 按钮中的文本?

    无需过多修改我自己的 CSS 是否有一个属性或配置可以用来左对齐文本md按钮 https material angularjs org latest api material components button directive mdBu
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • MIPS 获取地址未在字边界上对齐,使用了 .align 4,仍然无法执行

    有任何想法吗 为什么我得到 0x00400020 处的运行时异常 获取地址未在字边界 0x00000007 上对齐 问题行是 lw s1 0 a1 copy arg2 数组大小 data align 4 added this didnt w

随机推荐

  • Android学习博客和文章存档

    Android基础 Android总结篇 http blog csdn net codeemperor article details 51004189 Android最佳性能实践 一 合理管理内存 http blog csdn net g
  • Linux命令行中创建的软连接(ln -s)的无法移动问题,以及绝对路径和相对路径的概念

    最近刚开始学习鸟哥的Linux基础篇 昨天试验了其中的一些命令 发现在某一个目录下对某个目录创建的软连接在移动到另一个目录下之后就无法正常打开了 问了下同学 这个问题顺利的解决了 首先 在目录dir1下创建一个目录dir2 用到的命令是 j
  • SpringMVC(狂神学习笔记)2021-10-5

    注意 本笔记是在学习狂神的视频教程的记录 1 回顾MVC 1 1 什么是MVC MVC是模型 Model 视图 View 控制器 Controller 的简写 是一种软件设计规范 是将业务逻辑 数据 显示分离的方法来组织代码 MVC主要作用
  • CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda错误

    在使用anaconda创建一个新的环境 执行 conda create n tf110 python 3 6 出现了 CondaHTTPError HTTP 000 CONNECTION FAILED for url
  • 我的电路实践

    任务一 任务二 任务三 任务四
  • 自动解压目录及子目录下所有压缩文件的批处理(偷懒专用^_^)

    以下内容存为 bat文件 置于你需要操作的目录下 双击运行即可自动解压目录及子目录下的所有 rar压缩文件 保持原有目录结构 并在解压后删除原压缩文件 可以根据自己需要对目录等进行修改 改成带参数的批处理或者对特定目录操作的批处理 将这个批
  • caliper的实操与报错合集,超详细的教程

    实操 验证python make g gcc git版本 sudo apt install y python2 7 sudo apt install y pip sudo apt install y make sudo apt instal
  • ACL2022 用于开放域问答的复制增强生成模型 A Copy-Augmented Generative Model for Open-Domain QuestionAnswering

    第一遍 标题 摘要 结论 可以看一看方法和实验部分重要的图和表 这样可以花费十几分钟时间了解到论文是否适合你的研究方向 第二遍 确定论文值得读之后 可以快速的把整个论文过一遍 不需要知道所有的细节 需要了解重要的图和表 知道每一个部分在干什
  • 数据可视化——seaborn(二)

    上一篇文章主要讲述了有关seaborn的一些基础设置 可以让使我们绘制的图形更加饱满 接下来我们来看seaborn可以绘制哪些图形 左边是我们常用的绘图接口 右边则是一些基础设置 还有一些功能有待补充 依次来看这些函数的实现方式和具体功能
  • IPv6 基础知识

    一 包结构 基本的 IPv4 报头包含 12 的字段 20 个字节长 options 和 padding 字段在需要时添加 基本的 IPv6 报头 40 个 8 位 bit 即 40 个字节长 共 8 个字段 下一个报头 Next Head
  • 兔子生兔子问题(java实现)

    一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问第n个月的兔子对数为多少 分析 第一个月是1对第二个月是1对第三个月是1 1 2对第四个月是2 1 3对第五个月是3 2 5对第六个月
  • MybatisPlus 多租户架构(SaaS)实现

    引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行 至于谁来做选择数据库这件事儿 无非两个 要么中间件帮我们做 要么程序自己做 因此 一般来讲 读写分离有两种实现方式 第一种是依靠中间件 比如 MyCat 也就是说应用程序连接
  • 50_Pandas读取 Excel 文件 (xlsx, xls)

    50 Pandas读取 Excel 文件 xlsx xls 要使用 pandas 将 Excel 文件 扩展名 xlsx xls 作为 pandas DataFrame 读取 请使用 pandas read excel 函数 这里 将描述以
  • python: logHelper

    encoding utf 8 版权所有 2023 涂聚文有限公司 许可信息查看 https docs python org 3 library logging html 描述 https www programcreek com pytho
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记17——ETH数据结构篇1(状态树1)

    北京大学肖臻老师 区块链技术与应用 公开课笔记 以太坊数据结构篇1 状态树1 对应肖老师视频 click here 全系列笔记请见 click here 以太坊数据结构篇1 状态树2请见 click here About Me 点击进入我的
  • uniapp swiper 指示点位置修改 亲测有用

    只需要设置swiper的高度高于子元素swiper item就OK 有效回来点个赞哈
  • 解决UE4缓存使C盘膨胀的问题

    大家好 可能很多新手使用UE4的时候会发现C盘越来越小了 那是因为UE4引擎的缓存文件默认保存在C盘的缘故 下面来告诉大家怎么解决这个问题 概述 一 出现的问题 UE4的缓存文件会导致C盘膨胀 二 解决的方式 请严格按照下列步骤来执行 1
  • springdata JPA@Query注解及@Modifying注解

    Query注解查询适用于所查询的数据无法通过关键字查询得到结果的查询 这种查询可以摆脱像关键字查询那样的约束 将查询直接在相应的接口方法中声明 结构更为清晰 这是Spring Data的特有实现 索引参数与命名参数 1 索引参数如下所示 索
  • c#操作符operate的用法

    operate operate 的用法 看代码 public struct CorePoint
  • 用户自定义类型(User-defined Type)参数的传递

    用户自定义类型 User defined Type 参数的传递 用户自定义类型在VB中是一种重要的数据类型 它为编程者提供了很大的灵活性 使开发人员可以根据需要构造自己的数据结构 它相当于C C 中的结构类型 structure 在VB中