我在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
是String
而OpenWeb
实际上是Integer
,但我已将其声明为Double
而没有任何内容(仅Dim OpenWeb
})仍然得到溢出错误。
更新
没有设法找出那里发生的事情,而是另一个调用IE的解决方案:
Dim IE
sUrl = "http://www.google.com/"
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate sUrl
答案 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
找不到指定的路径。与文档相反,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
即使这不是相当“正确”,因为应该添加异常处理。 intCodID
和intCodUser
都可能需要“清理”(UrlEncoding),具体取决于它们的类型和实际值。根据名称,这些可能是Integers
,您依赖于隐式字符串强制?如果是这样,他们可能会好的。
BTW,正如我们在上面看到的那样,特殊文件夹名称已经过本地化就此而言,系统驱动器可能根本不是C:\
!因此,这些路径永远不应该是硬编码的,而是根据从调用Shell32
返回的值来构建,以查找特殊文件夹。
答案 1 :(得分:-1)
整数只能是整数。没有小数。
你说它被声明为一个整数因此你不能分配1.任何东西,你当然不能将这样的东西分配给一个数字变量,因为它不是一个有效的数字,因为它有两个小数点。
您需要将其声明为字符串。