开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6510|回复: 1
收起左侧

[原创视频分享] 第五十三集Excel-vba指针调用易语言DLL并返回文本

[复制链接]
结帖率:100% (3/3)
发表于 2021-4-29 17:36:01 | 显示全部楼层 |阅读模式   辽宁省沈阳市
分享视频教程
教程类型: 语音教程       
教程讲师: 小虫子
下载地址1: https://share.weiyun.com/BWTJhV7T
本帖最后由 宇智波·佐助 于 2021-5-18 16:27 编辑

第五十三集Excel-vba指针调用易语言DLL并返回文本


VB6中 ValPtr、 StrPtr、 ObjPtr函数的作用
------------------------------------------------------------------------
VarPtr :返回变量地址
StrPtr :返回真正的 UNICODE字符串缓冲区的地址
ObjPtr :返回任何对象变量引用的地址
StrConv:("要转换的字符串",转换类型)
Space  :返回特定数目空格的 Variant (String)
String :函数 返回 Variant (String),其中包含指定长度重复字符的字符串。
Len    :函数 得到字符串的长度
------------------------------------------------------------------------
Len(string) 函数执行成功时返回字符串的长度,发生错误时返回-1。
------------------------------------------------------------------------
String(number, character)

String 函数的语法有下面的命名参数:

部分          说明
number          必要参数;Long。返回的字符串长度。如果 number 包含 Null,将返回 Null。
characte  必要参数;Variant。为指定字符的字符码或字符串表达式,其第一个字符将用于建立返回的字符串。如果 character 包含 Null,就会返回 Null。
------------------------------------------------------------------------
Dim MyString
' 返回 10 个空格的字符串。
MyString = Space(10)

' 将 10 个空格插入两个字符串中间。
MyString = "Hello" & Space(10) & "World"
------------------------------------------------------------------------
Dim i As Long
Dim x() As Byte
x = StrConv("ABCDEFG", vbFromUnicode)    ' 转换字符串。
For i = 0 To UBound(x)
    Debug.Print x(i)
Next


常数        值        说明
vbUpperCase        1        将字符串文字转成大写。
vbLowerCase        2        将字符串文字转成小写。
vbProperCase        3        将字符串中每个字的开头字母转成大写。
vbWide          4        将字符串中单字节字符转成双字节字符。
vbNarrow        8        将字符串中双字节字符转成单字节字符。
vbKatakana        16        将字符串中平假名字符转成片假名字符。
vbHiragana        32        将字符串中片假名字符转成平假名字符。
vbUnicode        64        根据系统的缺省码页将字符串转成 Unicode。 (在Macintosh中不可用。)
vbFromUnicode        128        将字符串由 Unicode 转成系统的缺省码页。 (在Macintosh中不可用。)
------------------------------------------------------------------------
下面是这三个函数的具体用法
StrPtr
该函数主要用来产生高效的 UNICODE API调用。在VB4, UNICODE形式的AP函数的调用必须借助于Byte数
组,例如

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll"(pstr as Byte)

Sub Makecall(Mystr as String)
Dim bImp() as Byte
bImp=Mystr & vbNullchar
MyUnicodeCall bImp(0)
MyStr=bImp
MyStr=left(Mystr, Len(Mystr)-1)
End sub

如果使用 StrPtr,上面的代码精简为
Declare Sub MyUnicodeCall Lib"MyUnicodeDll.dll"(pstr as Byte)

Sub Make call(Mystr as String)
MyUnicodeCall StrPtr(MyStr)
End sub
------------------------------------------------------------------------
VarPtr/ Strptr/ ObjEt的执行速度非常非常快,因此调用UNICODE函数所赞成有系统负担实际上小于调用相
对应的ANSI函数。因为前者不需进行转换
VarPtr还能用于优化 ANSI API函数的调用。在调用时使用 StrConv和 Strptr就能避免将—个字符串变量多资传
递给函数以及为每个调用而执行转换操作所造成的系统负担。例如原来的

VarPtr还能用于优化 ANSI API函数的调用。在调用时使用StrConv和StrPtr就能避免将一个字符串变量多资传
递给函数以及为每个调用而执行转换操作所造成的系统负担。例如原来的

Declare Sub MyAnsiCall Lib "MyAnsiDll.dll"(ByVal pstr As String)
MyAnsiCall Mystr

现在变为

Declare Sub MyAnsiCall Lib "MyAnsiDll.dll"(ByVal pstr As Long)
MyStr=StrConv(Mystr, vbFromUnicode)
MyAnsiCall StrPtr(MyStr)
MyStr=StrConv( MyStr,unIcode)注释:并不总是要求

Strptr还是唯一能直观地告诉你空字符串和null字符串的不同的方法。对于null字符串(vbNullString), StrPtr
的返回值为0,而对于空字符串,函数的返回值为非零

VarPtr

该函数能与要求包含有UNICODE字符串的结构的AP调用一起使用。如果将个MyUDTVariable变量(一个
自定义类型的变量)传递给一个由 ByRef UDTParam As MyUDT定义的参数,就会发生ANSI/ UNICODE之间
的转换。但是,如果将 VarPtr( MyUDTVariable)传递给由 ByVal UDTParam As Long定义的参数,则不会发
生这样的转换

有一点需要特别注意,在VB中指针的算法非常重要。此外,你必须计算元素的大小,因为VB不会帮你完成这
项工作。你还必须处理缺乏无符号长整型数据类型的问题。下面的函数实现了无符号算法

Function UnsingedAdd By Val Start As Long ByVal Incr As Long)As Long
Const SignBit As Long=&H80000000
UnsignedAdd=(Start Xor SignBit)+ Incr Xor SignBit
End function

ObiPtr

该函数返回由对象变量引用的接口指针。由于大多数对象都支持多重接口,因此搞清楚地址对应的是对象的哪
一个接口就非常重要了。通常个函数用来放在集合中的对象。通过创建基于对象地址的关键字,你就可以在不
需要启遍历整个集合中所有元素的情况下,轻松地将对象从集合中删除。在许多情况下,对象地址是唯-可靠
的能作为关键字的东西

001.png
002.png
模块主界面.png

发表于 2021-4-29 18:48:01 | 显示全部楼层   四川省达州市
[图片][图片]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表