在Win XP上运行的VB6程序出现溢出错误
我在Windows XP上运行的VB6.exe文件中收到错误消息 我在Windows 7/8上编译并“生成”,但在XP上执行这两行时,总是会收到溢出错误消息:在Win XP上运行的VB6程序出现溢出错误,vb6,Vb6,我在Windows XP上运行的VB6.exe文件中收到错误消息 我在Windows 7/8上编译并“生成”,但在XP上执行这两行时,总是会收到溢出错误消息: sUrl = "C:\Arquivos de Programas\Internet Explorer\IEXPLORE.EXE http://example.com/WebForms/send.aspx?id=" & intCodID & "&type=500&usr=" & intCodUser
sUrl = "C:\Arquivos de Programas\Internet Explorer\IEXPLORE.EXE http://example.com/WebForms/send.aspx?id=" & intCodID & "&type=500&usr=" & intCodUser
openWeb = Shell(sUrl, vbMaximizedFocus)
sUrl
是一个字符串
,OpenWeb
实际上是一个整数
,但我已经声明它为Double
和nothing(只是Dim OpenWeb
),并且仍然得到溢出错误
更新 没有发现那里发生了什么,但另一个呼叫IE的解决方案是:
Dim IE
sUrl = "http://www.google.com/"
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate sUrl
整数只能是整数。没有小数 你说它被声明为整数,因此你不能赋值1。你当然不能给一个数字变量赋值,因为它不是一个有效的数字,因为它有两个小数点
您需要将其声明为字符串。而VB6文档说的是
Shell()
返回一个变量Double。。。这似乎是早期版本VB手册中遗留下来的过时信息。相反,如果您检查typelib信息(即查看IDE的对象浏览器),它实际上会返回一个Double
type结果值
据我所知,Shell()
是对WinExec()
函数调用的包装
返回的值是:
系统内存或资源不足0
该.exe文件无效ERROR\u BAD\u FORMAT=11
找不到指定的文件ERROR\u FILE\u NOT\u FOUND=2
找不到指定的路径ERROR\u PATH\u NOT\u FOUND=3
- 或进程ID
Shell()
将这些错误值转换为异常(“找不到文件”、“过程调用或参数无效”等)。因此,如果调用成功,您总是会返回一个PID值
在所有情况下,这都是一个DWORD。因此,它总是适合在一个双没有溢出的可能性。如果您看到溢出,那么代码中还有其他错误
不幸的是,虽然Double至少可以保存整个值范围,但它在这里并不是特别有用。但您通常希望仔细地将其转换为长值:
Option Explicit
Function DDoubleToDLong(ByVal DDouble As Double) As Long
'Some functions like the intrinsic Shell() return a Double
'to get around the lack of a UI4 type (DWORD, i.e. unsigned
'Long) in VB. Of course this isn't clean to pass to API
'calls, making it sort of worthless so we need to do a type
'conversion such as this:
If DDouble > 2147483647# Then
DDoubleToDLong = CLng(DDouble - 2147483648#) Or &H80000000
Else
DDoubleToDLong = CLng(DDouble)
End If
End Function
Private Sub Form_Load()
Dim DD As Double
Dim DL As Long
AutoRedraw = True
Font.Name = "Courier New" 'Or other handy monospaced font.
Font.Size = 12@
DD = 0#: DL = DDoubleToDLong(DD): Print DD, DL, Hex$(DL)
DD = 1#: DL = DDoubleToDLong(DD): Print DD, DL, Hex$(DL)
DD = 2147483647#: DL = DDoubleToDLong(DD): Print DD, DL, Hex$(DL)
DD = 2147483648#: DL = DDoubleToDLong(DD): Print DD, DL, Hex$(DL)
DD = 4294967295#: DL = DDoubleToDLong(DD): Print DD, DL, Hex$(DL)
End Sub
Integer
毫无价值,因为溢出很常见<代码>长如果不进行转换,可能会不时导致溢出<代码>字符串太傻了
您还需要引用EXE及其arguments属性的值,如中所示:
Option Explicit
Function DDoubleToDLong(ByVal DDouble As Double) As Long
If DDouble > 2147483647# Then
DDoubleToDLong = CLng(DDouble - 2147483648#) Or &H80000000
Else
DDoubleToDLong = CLng(DDouble)
End If
End Function
Private Sub Form_Load()
Dim sUrl As String
Dim PID As Long
sUrl = """C:\Arquivos de Programas\Internet Explorer\IEXPLORE.EXE"" " _
& """http://example.com/WebForms/send.aspx?id=" _
& intCodID _
& "&type=500&usr=" _
& intCodUser _
& """"
PID = DDoubleToDLong(Shell(sUrl, vbMaximizedFocus))
End Sub
即使这样也不太“正确”,因为应该添加异常处理。而intCodID
和intCodUser
都可能需要“清理”(URLCodening),这取决于它们是什么类型以及它们真正拥有什么值。这些可能是基于名称的整数
,您是否依赖隐式字符串强制?如果是这样的话,他们可能没问题
顺便说一句,正如我们在上面看到的,特殊文件夹名称会本地化。因此,系统驱动器可能根本就不是
C:\
!因此,此类路径不应硬编码,而应基于调用Shell32
以查找特殊文件夹返回的值来建立。此外,intCodID
和intCodUser
都有整数值。不确定是否相关,但我很确定,如果要将该字符串传递到命令提示符/shell,则需要在路径周围提供双引号,因为路径中有空格。至于错误,intCodID
和intCodUser
的实际值是多少?程序是否在sUrl=
行或openWeb=Shell(sUrl,vbMaximizedFocus)
行抛出溢出错误?@RianBattle您不需要对Shell
使用双引号。但您需要为WshShell.Run运行
@RianBattle,intCodID最大值为“1.155.712”,intCodUser有四位数字。溢出在openWeb=Shell(sUrl,vbMaximizedFocus)
行中抛出。在这里添加了额外的引号。为什么有一个VB.Net标记和一个VB6标记?这个问题肯定是关于其中一个的吗?在评论之前请仔细阅读。他有两个错误。