VB6中的函数Instr,Split函数在Win7 64位中不能正常使用?

超级松林 2017-09-11 07:46:14
VB6中的函数Instr,Split函数在Win7 64位中不能正常使用
1.在IDE中,运行状态时,函数结果混乱;
2.编译后使用正常;
测试代码

Private Sub cmdTest_Click()
Dim strY As String
Dim varR As Variant
'txtY.text="12,36"
strY = Trim$(txtY.Text)
varR = Split(strY, ",", , vbTextCompare)
MsgBox "" & varR(0) & "|" & varR(1), vbInformation, "系统消息"
End Sub


IDE运行结果: [|2,36]
编译后结果:[12|36]
...全文
1465 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级松林 2017-09-30
  • 打赏
  • 举报
回复
谢谢Chen8013,果然证实你说的。 分数马上给上。
舉杯邀明月 2017-09-20
  • 打赏
  • 举报
回复
引用 14 楼 blyfe 的回复:
各位,直接的没解决,SP6,包括VB6的兼容64位开发补丁都打过了。 实在没有法子,我自己写了一个替代函数。
楼主你可以结贴了,问题就是 bakw 在17楼说的那个。 看来还是不要设置“兼容模式” 运行才是王道…………
舉杯邀明月 2017-09-20
  • 打赏
  • 举报
回复
试了一下,选“Win 98”那个兼容模式也是一样。
舉杯邀明月 2017-09-20
  • 打赏
  • 举报
回复
引用 17 楼 bakw 的回复:

把VB执行文件这个XP兼容模式的钩去掉,然后就好了

我从来没有对VB进行过“兼容模式“的设置,所以还从来没有遇到过这些怪事。

刚才试了一下,设置那个“兼容模式”后,还真有这种问题。
难道当设置了“兼容模式”后,运行程序,它加载的MSVBVM60.dll,不是系统中默认的那一个,
  而是专门为“兼容模式”运行的程序准备了另一套dll? 


并且大概的试了一下 Instr( )这个函数,在选用 vbTextCompare比较模式时:
如果“起始位置”为1,不管找什么字符(即使被找的字符串中根本没有),它的返回值都是1(也就是不管找什么,它都说“第1个就是它”);
 而如果“起始位置”从2开始,不管找什么字符(即使后面有要找的字符),它的返回值都是0(也就是“没有了”)。
如果是找“子串”(两个或更多的字符,刚才前面说的是“单个字符”),不管找什么、不管是否存在,它都是0(也就是“不存在”)。

这就可以解释清楚楼主的“问题”所在了:
由于“vbTextCompare”模式、并且是“1个字符分隔”的缘故,“分隔符搜索结果”是1,因此Split( )的结果是两个元素:
  第1个元素为“空字符串”、第1个字符被当成分隔符吃掉;然后剩下的所有字符分配到第2个元素中。

结果就是楼主所遇到的那样了…………
笨狗先飞 2017-09-19
  • 打赏
  • 举报
回复
把VB执行文件这个XP兼容模式的钩去掉,然后就好了
笨狗先飞 2017-09-19
  • 打赏
  • 举报
回复
测试了一下,用普通的vbBinaryCompare不会出错,用了vbTextCompare就不行,Instr,InstrRev,Split,Replace都会失效
超级松林 2017-09-19
  • 打赏
  • 举报
回复
引用
超级松林 2017-09-19
  • 打赏
  • 举报
回复
各位,直接的没解决,SP6,包括VB6的兼容64位开发补丁都打过了。 实在没有法子,我自己写了一个替代函数。
思考 2017-09-14
  • 打赏
  • 举报
回复
Dim strY$, txt$, varR$() txt = "12,36" varR = Split(txt, ",") MsgBox "" & varR(0) & "|" & varR(1) '我就不信不显示“12|36”
脆皮大雪糕 2017-09-12
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
[quote=引用 3 楼 chewinggum 的回复:] win10 64位 VB6没打补丁,运行结果正常,编译前后一致
本身就是SP6的吧? [/quote] win10即使运行时啥的有SP6 ,拿98年的安装程序干下去也都打回原形了吧
赵4老师 2017-09-12
  • 打赏
  • 举报
回复
没准那个逗号只是看上去象逗号。
舉杯邀明月 2017-09-12
  • 打赏
  • 举报
回复
引用 7 楼 bakw 的回复:
严重怀疑是那个逗号全半角的问题。
不用怀疑,最后一个参数给定了vbTextCompare,那逗号全角、半角就没区别。
舉杯邀明月 2017-09-12
  • 打赏
  • 举报
回复
引用 6 楼 chewinggum 的回复:
[quote=引用 4 楼 Chen8013 的回复:] [quote=引用 3 楼 chewinggum 的回复:] win10 64位 VB6没打补丁,运行结果正常,编译前后一致
本身就是SP6的吧? [/quote] win10即使运行时啥的有SP6 ,拿98年的安装程序干下去也都打回原形了吧[/quote] 这个“SP6”是VB6的,跟Win10无关啊。
舉杯邀明月 2017-09-12
  • 打赏
  • 举报
回复
引用 11 楼 chewinggum 的回复:
. . . . . . . . . 我的意思是:即使win10自带的vb6运行库和必要控件已经是Sp6的了,我拿98年的原始安装包安装一下VB6,也把系统自带的运行库打回原形了。
应该不会: 1. 我在4楼的意思,就是说你安装的VB6本来就是 SP6版本的了。 2. 即使系统中相关组件是SP6的文件、而你安装的VB6不是带SP6的,   那么安装时,“旧版本”文件是不会替换系统中的新版本文件的(安装程序会进行版本冲突检查),   最终那些“系统自带”的东西还是SP6的。
脆皮大雪糕 2017-09-12
  • 打赏
  • 举报
回复
引用 8 楼 Chen8013 的回复:
[quote=引用 6 楼 chewinggum 的回复:] [quote=引用 4 楼 Chen8013 的回复:] [quote=引用 3 楼 chewinggum 的回复:] win10 64位 VB6没打补丁,运行结果正常,编译前后一致
本身就是SP6的吧? [/quote] win10即使运行时啥的有SP6 ,拿98年的安装程序干下去也都打回原形了吧[/quote] 这个“SP6”是VB6的,跟Win10无关啊。 [/quote] 我的意思是:即使win10自带的vb6运行库和必要控件已经是Sp6的了,我拿98年的原始安装包安装一下VB6,也把系统自带的运行库打回原形了。
笨狗先飞 2017-09-12
  • 打赏
  • 举报
回复
严重怀疑是那个逗号全半角的问题。
舉杯邀明月 2017-09-11
  • 打赏
  • 举报
回复
当然: 其实我也觉得跟是否SP6没有多大关系。 
舉杯邀明月 2017-09-11
  • 打赏
  • 举报
回复
引用 3 楼 chewinggum 的回复:
win10 64位 VB6没打补丁,运行结果正常,编译前后一致
本身就是SP6的吧? 
脆皮大雪糕 2017-09-11
  • 打赏
  • 举报
回复
win10 64位 VB6没打补丁,运行结果正常,编译前后一致
舉杯邀明月 2017-09-11
  • 打赏
  • 举报
回复
哪有这么怪的事啊。 VB6的Split 的“操作函数”只有一个,就是MSVBVM60.dll中的 rtcSplit 。 无论IDE下还是编译后,都是调用这个接口进行操作的。 会不会楼主自己的代码中写了个“不正确的Split函数”? (当然可能性很小 ) 你在代码中的 Split处点鼠标右键,再点“定义”,看看它是不是打开对象浏览器、定位到 VBA.String模块中了? 还有一点: 你试试 把Dim varR As Variant 改成 Dim varR() as string 看看。
加载更多回复(1)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧