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

时间:2015-08-04 17:44:46

标签: 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 
openWeb = Shell(sUrl, vbMaximizedFocus)

sUrlStringOpenWeb实际上是Integer,但我已将其声明为Double而没有任何内容(仅Dim OpenWeb })仍然得到溢出错误。

更新

没有设法找出那里发生的事情,而是另一个调用IE的解决方案:

Dim IE
sUrl = "http://www.google.com/"
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate sUrl

2 个答案:

答案 0 :(得分:0)

虽然VB6文档说Shell()返回一个Variant Double ......这似乎是VB的earler版手册留下的过时信息。相反,如果您检查typelib信息(即在IDE的对象浏览器中查找),它实际上会返回Double类型的结果值。

据我所知,Shell()是对WinExec()函数调用的包装。

返回的值为:

  • 0系统内存或资源不足。
  • ERROR_BAD_FORMAT = 11 .exe文件无效。
  • ERROR_FILE_NOT_FOUND = 2找不到指定的文件。
  • ERROR_PATH_NOT_FOUND = 3找不到指定的路径。
  • 或进程ID

与文档相反,Shell()将这些错误值转换为异常(“找不到文件”,“无效的过程调用或参数”等)。因此,如果调用成功,您将始终返回PID值。

在所有情况下,这都是DWORD。所以它总是适合Double而不会出现溢出。如果您看到溢出,则代码中会出现其他问题。

可悲的是,Double在这里并不是特别有用,尽管它至少可以保留整个值范围。但是你通常要小心地将它转换为Long值:

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毫无价值,因为溢出会很常见。没有转换的Long可能会偶尔导致溢出。 String只是愚蠢。

您还需要引用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

即使这不是相当“正确”,因为应该添加异常处理。 intCodIDintCodUser都可能需要“清理”(UrlEncoding),具体取决于它们的类型和实际值。根据名称,这些可能是Integers,您依赖于隐式字符串强制?如果是这样,他们可能会好的。

BTW,正如我们在上面看到的那样,特殊文件夹名称已经过本地化就此而言,系统驱动器可能根本不是C:\!因此,这些路径永远不应该是硬编码的,而是根据从调用Shell32返回的值来构建,以查找特殊文件夹。

答案 1 :(得分:-1)

整数只能是整数。没有小数。

你说它被声明为一个整数因此你不能分配1.任何东西,你当然不能将这样的东西分配给一个数字变量,因为它不是一个有效的数字,因为它有两个小数点。

您需要将其声明为字符串。