




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、易语言中挪用DLL 利用说明大体说明本文所描述的部份功能需易语言或以上版本支持。“在易语言中挪用DLL ”包括两方面的内容:挪用Windows 系统 API 函数;挪用一般DLL函数。下文用到的“挪用API ”或“挪用DLL ”等字眼,除非专门注明,一样都是指以上两方面之一或之和,视上下文而定。绝大多数情形下,无需明确区分挪用的是系统API 仍是一般DLL 。目前易语言只支持以stdcall 方式挪用DLL中的导出函数。Windows 系统 API 一样都是以stdcall 挪用方式导出的,故在易语言中挪用它们时通常没必要考虑函数挪用方式的问题。而一般DLL 有可能导出“非stdcall 挪用
2、方式”(比如 cdecl)的函数,调历时需要专门注意。一样而言,考虑到通用性,DLL 开发者都会选择导出以sdtcall 方式挪用的函数。 (支持生成DLL 的编程语言通常都支持导出stdcall 挪用方式的函数,具体实现请参考各编程语言手册。)特别地,在VC 中类似如下代码导出的函数并非stdcall调用方式:extern C_declspec (dllexport ) test( int a, int b)return (a + b);导出):int WINAPItest (int a, int b)return (a + b);易语言编译生成的DLL ,其导出函数全数为stdcall挪用
3、方式, 因此在易语言中挪用易语言生成的DLL不存在问题。目前在易语言中挪用DLL时只支持 1 字节对齐的结构(自概念数据类型)若是 DLL命令的某个参数或参数的某个成员是结构类型(自概念数据类型),那么其对齐方式必需是1 字节对齐。 Windows 系统 API 中所用到的结构都是1 字节对齐的,故在挪用API 时不受此限制。但如果是想用其它编程语言生成DLL 供易语言挪用且数据类型中包括了1 或 2 字节数据长度的成员(如字符型或短整数),就需要考虑结构的1 字节对齐。在VC中,能够如此概念1 字节对齐的结构(结构在C/C+ 中称为struct):#pragmapack (push , ol
4、d_value )ll ”。如果是Windows系统DLL的话,可以省略不填。在Dll库中对应命令名可以使用绝对路径或相对路径,使用相对路径时路径相对于当前“ .e”文件(调试运行时)或当前“.exe”文件(编译后运行时)。考虑到通用性,不建议在此处指定路径,可在代码中以“置DLL 装载目录 () ”动态指定被调用 DLL 的路径。指定被调用的DLL 命令(或函数)名称。必须准确填写。名称中的英文字母不区分大小写。注意:某些带文本参数的API ,其函数名称通常以“A ”或“ W ”结尾 。 如FindWindow函 数,其实中只 有FindWindowA和FindWindowW ,并没有Fin
5、dWindow ,所以我们在这里要填FindWindowA和 FindWindowW而不是 FindWindow 。参数名定义该 DLL 命令在易语言中的名称。必须填写, 但具体什么名称并不重要。Dll 参数)类型定义该参数的实际类型所对应的易语言类型。可以为易语言自定义数据类型(该数据类型的成员必须与 DLL 所需数据类型的成员一一对应) 。易语言中的数据类型与生成该 DLL 的编程语言中的数据类型并不完全一致,需进行适当的转换,详见下文数据类型对照表。(Dll传址数组参数)备注如果选中本标志,表示将传递参数的内存首地址(类似C/C+ 中的传指针参数或 VB 中的 ByRef 参数或 Del
6、phi 中的 var 参数);如果不选中本标志,表示传递参数实际数据。应根据该DLL 的参数声明或参数说明来决定是否使用“传址”,详见示例。此外,如果参数为文本型、字节集型,或者为数组数据,则总是传址(而不管此处是否定义为传址)。指定是否传入数组数据。应根据该DLL 的参数声明或参数说明来决定是否使用“数组”,详见示例。对该参数的注释,可以不填。注:上表中所谓“实际(数据)类型”表示在生成该DLL的编程语言中参数或返回值的数据类型。易语言与 VB ,C/C+, API 的数据类型对照表(待更新):易语言VBC/C+, API整数型Longint, long, bool, INT, LONG,
7、BOOL, DWORD, UINT, LRESULT,WPARAM, LPARAM, HWND, HFILE, HMODULE,文本型Stringchar*, LPSTR, LPTSTR, LPCSTR, LPCTSTR逻辑型Longint, INT, BOOL字节集型Void*, LPVOID小数型SingleFloat双精度小数型Double, CurrencyDouble日期时间型DateDA TE字节型Bytebyte, char, bool, BYTE, CHAR短整数型Integer, Booleanshort, SHORT, WORD长整数型_int64, INT64注 1:固定
8、长度的文本(如 VB 中的“ Dim s As String * 32 ”或 C/C+ 中的“ char s32; ”)在易语言中应概念为相应长度的字节型数组,并传址。注 2:各编程语言之间数据类型彼此对照的一样原那么是“所占内存字节数相同”。注 3:VB 的 Integer,Bool 均占两个字节内存,而易语言的“整数型”“逻辑型”均占四个字节内存,注意区分。注 4:若是不能确信其它编程语言中的某个数据类型对应易语言的哪个类型,可第一尝试“整数型” ,然后可尝试“字节集” (注意利用前以“取空白字节集 () ”等命令分派足够的内存空间) 。注 5:有些 API (如 FindWindow(A
9、) )的文本参数需要接收 NULL 值,有两种处置方案:在易语言中将该参数概念为整数型并传入 0;在易语言中将该参数概念为文本型并传入“字符(0)”(在那个地址“字符 (0)”类似于VB 中的 vbNullString )。自概念数据类型若是 DLL 命令中有参数为结构类型,就需要事前在易语言中概念与其对应的自概念数据类型。概念自概念数据类型的成员,与概念DLL 命令的参数大体相同(具体含义请参考上文),只是有一点不同:若是 DLL 命令参数为数组,将忽略 “传址” 设置并老是以为 “传址”;但如果是自概念数据类型成员为数组,“传址”与否有不同的含义。另外,自概念数据类型的成员“数组”属性需指
10、定一个明确的数值,而不象DLL 命令参数那样仅仅设置一个标志。在自概念数据类型的成员为数组时,若是设置“传址” ,表示在此自概念数据类型中该成员位置处只存储数组数据的内存首地址;若是不设置传址,表示在此自概念数据类型中该成员位置处的数据为所有数组数据的顺序排放。至于如何判定某自概念数据类型成员是不是为“数组”及是不是应该“传址”,那么应视具体的自概念数据类型及其说明文档而定,有时还需考虑该成员的“语义”。C/C+ 定义CPINFOC/C+易语言定义struct _cpinfo UINT ;BYTE MAX_DEFAULTCHAR;BYTE MAX_LEADBYTES; CPINFO, *LPC
11、PINFO;CPINFO 的最后两个成员都是字节型数组,且不是地址,因此应将其别离概念为“字节型”“数组”(数组长度别离为MAX_DEFAULTCHAR和 MAX_LEADBYTES,查 VC 相应头文件得知两个常量的值别离是2 和 12)。自概念数据类型成员是数组且需要“传址”的情形比较少见,暂举一例:C/C+ 定义易语言定义struct x_Info DWORD* value;CHAR* pChars;32”32”The first structure specifies the starting point. The remaining points are in groups of t
12、hree, consisting of two control points and an end point.cPointsLong , lppt数组的总点数依照上表,能够得知,PolyBezier 函数位于动态库“gdi32 ”中;返回值类型为Long ,依照语义咱们选择概念为易语言中的“逻辑型” (理由同上) ;第一个和第三个参数都是 Long ,均对应易语言中的“整数型” ;第二个参数,依照参数说明可知它是一个“指向 POINTAPI 结构数组的指针” ,参数类型为“ POINTAPI ”(后面将为那个结构概念一个易语言自概念数据类型) ,“数组”,“传址”。依照以上分种,取得了易语言
13、 DLL 挪用表:因为上面用到了结构POINTAPI,咱们需要将它概念为易语言自概念数据类型。它有两个成员,参数都是Long ,对应易语言中的“整数型”:到此为止,已将所需的 DLL 命令及其自概念数据类型概念好了,下面就能够够象挪用易语言一般子程序一样挪用这几个 DLL 命令了:其它的 DLL 命令挪用表实例:注意上面两图的“在Dll库中对应命令名”一栏,命令最后都有一个字符“A ”,在其VB声明中就可找出其来源:DeclareFunctionOpenPrinterLibAliasOpenPrinterA(ByValpPrinterNameAsString,phPrinterAsLong,p
14、DefaultAsPRINTER_DEFAULTS) As LongDeclare Function GetOpenFileName Lib comdlg32 Alias GetOpenFileNameA (lpofn As tagOFN) As Long小结:咱们选择了几个比较复杂的、有代表性的DLL 挪用,详细分析并描述了从概念到挪用的全进程。希望本例如能够帮忙用户明白得并学会利用在易语言中挪用DLL命令,同时希望本例如已经向用户展现出了易语言对DLL 挪用的支持已足够完善并趋于完美。下一步, 易语言将封装所有经常使用的API 及相应的自概念数据类型,以避免去用户需自行概念DLL 和自概念数据类型的繁索步骤,加倍简化用户操作,届时,在易语言中挪用API就会象在VC 、 Delphi 或 C+ Builder 中一样方便快捷了。总结本文比
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030会展线上线下融合模式与运营实践调研报告
- 教学反思提升策略与案例分析
- 拆除及恢复工程施工组织方案试卷教案(2025-2026学年)
- 销售目标设定与绩效提升策略
- 民宿营销推广方案及执行细则
- 供应链管理优化方案模板风险与成本控制
- 企业文化建设方案手册企业文化塑造工具
- 机械制造工艺技术方案汇编
- 年度团队成长回顾互动方案
- 业务方案设计与可行性分析模板
- 食品有限公司化学品管理程序
- 【拆书阅读笔记】-《复盘》
- 媒介素养概论 课件 第0-2章 绪论、媒介素养、媒介素养教育
- 顶管顶力计算
- 综合实践活动课程的设计与实施
- 《影视鉴赏》教学课件 《影视鉴赏》第三章
- 职工三级安全教育卡模版
- 新疆民族团结模范人物
- 供应链金融业务培训课件
- 幼儿教育政策法规解读-高职-学前教育专业课件
- 污染场地环境风险管理与原位地下水修复技术 陈梦舫
评论
0/150
提交评论