关于内存无法读取~~

lovingkiss 2006-04-27 09:01:23
Type VS_NEWINFO
astr As String * 1024
End Type

Declare Function GetFileVersionInfo Lib "Version.dll" Alias _
"GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal _
dwhandle As Long, ByVal dwlen As Long, lpData As Any) As Long
Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias _
"GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, _
lpdwHandle As Long) As Long
Declare Function VerQueryValue Lib "Version.dll" Alias _
"VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, _
lplpBuffer As Any, puLen As Long) As Long
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(dest As Any, ByVal Source As Long, ByVal Length As Long)
Declare Function GetSystemDirectory Lib "kernel32" Alias _
"GetSystemDirectoryA" (ByVal Path As String, ByVal cbBytes As Long) As Long

Public Function GetFileCoName(FullFileName As String) As String
Dim rc As Long
Dim lDummy As Long
Dim szBuffer() As Byte
Dim lBufferLen As Long
Dim lVerPointer As Long
Dim lVerbufferLen As Long
Dim astr As String
Dim lTran As Long
Dim ab As VS_NEWINFO
On Error Resume Next
lBufferLen = GetFileVersionInfoSize(FullFileName, lDummy)
GetFileCoName = "未知"
If Not (lBufferLen < 1) Then
ReDim szBuffer(lBufferLen)
lVerPointer = 0
rc = GetFileVersionInfo(FullFileName, 0&, lBufferLen, szBuffer(0))
rc = VerQueryValue(szBuffer(0), "\VarFileInfo\Translation", lVerPointer, lVerbufferLen)
MoveMemory lTran, lVerPointer, 4&
astr = "0" + Hex$(lTran)
astr = Right$(astr, 4) + Left$(astr, 4)
rc = VerQueryValue(szBuffer(0), "\StringFileInfo\" + astr + "\CompanyName", lVerPointer, lVerbufferLen)
If rc Then
MoveMemory ab, lVerPointer, Len(ab)
GetFileCoName = Left$(ab.astr, (InStr(ab.astr, Chr$(0)) - 1))
Else
GetFileCoName = "未知"
End If
End If
End Function
...全文
232 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovingkiss 2006-05-10
  • 打赏
  • 举报
回复
问题解决,感谢各位
lovingkiss 2006-04-27
  • 打赏
  • 举报
回复
if lVerPointer <> 0 and rc<>0 then

没有用的,一样出错误——我是循环判断服务列表里的系统文件

有没有其他方式获取服务的供应商信息???
迈克揉索芙特 2006-04-27
  • 打赏
  • 举报
回复
不要用On Error Resume Next,
用判断API返回值的方法来决定是否继续执行下面的代码。
supergreenbean 2006-04-27
  • 打赏
  • 举报
回复
MoveMemory 前判断 lVerPointer是否为有效的指针
if lVerPointer <> 0 and rc<>0 then
MoveMemory lTran, lVerPointer, 4&
end if
lovingkiss 2006-04-27
  • 打赏
  • 举报
回复
几十个文件的操作时,偶尔的会产生这种内存无法读取的问题

1、如何避免出现这种情况?
2、如果不能避免,是否能够在产生错误的时候,不关闭整个系统?
maplevsred 2006-04-27
  • 打赏
  • 举报
回复
MoveMemory ab, lVerPointer, Len(ab)
这句有错

多定义一个API,
Declare Sub MoveBinToStr Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal dest As String, ByVal Source As Long, ByVal Length As Long)

然后把那句改为:
MoveBinToStr ab.astr , lVerPointer, lVerbufferLen

迈克揉索芙特 2006-04-27
  • 打赏
  • 举报
回复
只要能返回值的api都判断一下结果再决定是否继续执行。
supergreenbean 2006-04-27
  • 打赏
  • 举报
回复
VerQueryValue前也要保证lVerPointer的有效性

1,486

社区成员

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

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