在Win XP上运行的VB6程序出现溢出错误

在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

我在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 
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
    系统内存或资源不足
  • ERROR\u BAD\u FORMAT=11
    该.exe文件无效
  • 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标记?这个问题肯定是关于其中一个的吗?在评论之前请仔细阅读。他有两个错误。