VB6写的程序在Win2003上会崩溃

ahocat 2008-06-16 01:24:11
用VB6(SP6)写了一个程序遍历磁盘的所有文件,里面用了On Error Resume Next语句忽略那些没有访问权限的文件。
结果到了Win2003上程序遍历到一些文件名包含日文字符的文件时就会突然崩溃,同样的文件在Win2000、WinXP上都可以正常运行(被On Error忽略)。
后来又发现,编译成P-code的话在win2003上也能正常运行了,但是性能要差50%左右。

哪位高手能指点一下吗?
...全文
122 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
fso的话,用vbs脚本先试试不用编译的。。。这样的话,很容易调整
东方之珠 2008-06-16
  • 打赏
  • 举报
回复
我感觉不是操作系统的问题.
你可以试一下这个日语文件名的DOC文件能否在2003下被打开,如果能,那就不是操作系统的问题.
建议你使用API函数FindFirstFile,这样适应性强一些!
yangjinok 2008-06-16
  • 打赏
  • 举报
回复

Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

'最大路径长度和文件属性常量的定义
Public Const MAX_PATH = 260
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100

'自定义数据类型FILETIME和WIN32_FIND_DATA的定义
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Public Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

Public Function fDelInvaildChr(str As String) As String

On Error Resume Next
For i = Len(str) To 1 Step -1
If Asc(Mid(str, i, 1)) <> 0 And Asc(Mid(str, i, 1)) <> 32 Then
fDelInvaildChr = Left(str, i)
Exit For
End If
Next
End Function

Public Sub sDirTraversal(ByVal strPathName As String, ByRef objList As ListBox)

Dim sSubDir(200) As String '注释:存放当前目录下的子目录,下标可根据需要调整

Dim iIndex As Integer '注释:子目录数组下标

Dim i As Integer '注释:用于循环子目录的查找

Dim lHandle As Long '注释:FindFirstFileA 的句柄

Dim tFindData As WIN32_FIND_DATA '注释:

Dim strFileName As String ' 注释:文件名

On Error Resume Next

'注释: 初始化变量

i = 1

iIndex = 0

tFindData.cFileName = "" '注释:初始化定长字符串

lHandle = FindFirstFile(strPathName & "\*.*", tFindData)

If lHandle = 0 Then '注释: 查询结束或发生错误

Exit Sub

End If

strFileName = fDelInvaildChr(tFindData.cFileName)

If tFindData.dwFileAttributes = &H10 Then '注释: 目录

If strFileName <> "." And strFileName <> ".." Then

iIndex = iIndex + 1

sSubDir(iIndex) = strPathName & "\" & strFileName '注释:添加到目录数组

End If

Else

objList.AddItem strPathName & "\" & strFileName

End If

'注释:循环查找下一个文件,直到结束

Do While True

tFindData.cFileName = ""

If FindNextFile(lHandle, tFindData) = 0 Then '注释: 查询结束或发生错误

FindClose (lHandle)

Exit Do

Else

strFileName = fDelInvaildChr(tFindData.cFileName)

If tFindData.dwFileAttributes = &H10 Then

If strFileName <> "." And strFileName <> ".." Then

iIndex = iIndex + 1

sSubDir(iIndex) = strPathName & "\" & strFileName '注释:添加到目录数组

End If

Else

objList.AddItem strPathName & "\" & strFileName

End If

End If

Loop

'注释:如果该目录下有目录,则根据目录数组递归遍历

If iIndex > 0 Then

For i = 1 To iIndex

sDirTraversal sSubDir(i), objList

Next

End If

End Sub

嗷嗷叫的老马 2008-06-16
  • 打赏
  • 举报
回复
日文字符得按UNICODE处理是吧?

不知道有人整过没?
ahocat 2008-06-16
  • 打赏
  • 举报
回复
回3、4楼:

我用的是FileSystemObject对象。
ahocat 2008-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 alifriend 的回复:]
拿到03里编译,去掉on error,试试能不能有具体的报错信息
[/Quote]

在Win2003里编译也一样,报错信息如下:

Run-time error '5':
Invalid Procedure call or argument

出错的语句就是一个File对象,因为文件名中有不能识别的日文字符,所以它的Name属性就变成了“??????.doc”。
添加On Error后,在2000和XP里就可以忽略该错误,但是到了Win2003里访问到这个文件时又不行了,程序直接崩溃。
  • 打赏
  • 举报
回复
如果使用API,设置条件,使API在不同环境中可以使用
嗷嗷叫的老马 2008-06-16
  • 打赏
  • 举报
回复
遍历磁盘的所有文件,使用的是API还是DIR?

如果是用API,那建议用DIR吧,可能可以把范围缩小点
波导终结者 2008-06-16
  • 打赏
  • 举报
回复
拿到03里编译,去掉on error,试试能不能有具体的报错信息
舉杯邀明月 2008-06-16
  • 打赏
  • 举报
回复
我不清楚。
帮你顶贴~~~

7,763

社区成员

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

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