大侠们,小弟,enumrespourcenames枚举资源类型的有关问题
大侠们,小弟求助,enumrespourcenames枚举资源类型的问题。
小弟想实现这样的功能:
1.查找本exe文件资源区类型为一自定义类型x的资源名称,
2.通过枚举,枚举到所有这种类型的资源
3.将枚举到的资源输出到文本文档
目前的代码提示错误如下:“缺少End Sub”
以下是代码:
不好易思,小弟不才,错误可能很多,见笑了!
------解决方案--------------------
这位兄台,函数定义不可以嵌套哦,就是说EnumResNameProc的定义不可以放在Form_Load()
里面的。EnumResNameProc是一个回调函数,就是说Windows来调用它,在VB里,这个函数只能放在模块里,然后在函数EnumResourceNames中用AddressOf关键字调用。
小弟想实现这样的功能:
1.查找本exe文件资源区类型为一自定义类型x的资源名称,
2.通过枚举,枚举到所有这种类型的资源
3.将枚举到的资源输出到文本文档
目前的代码提示错误如下:“缺少End Sub”
以下是代码:
- VB code
Private Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As String) As Long Private Declare Function LoadResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long Private Declare Function LockResource Lib "kernel32" (ByVal hResData As Long) As Long Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long Private Declare Function EnumResourceNames Lib "kernel32" Alias "EnumResourceNamesA" (ByVal hModule As Long, ByVal lpType As String, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Private Declare Function SizeofResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long Private Const GENERIC_WRITE = &H40000000 Private Const CREATE_ALWAYS = 2 Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Private Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Private Sub Form_Load() '枚举 Public Function EnumResNameProc(ByVal hModule As Long, ByVal lpType As String, ByVal lpName As String, ByVal lParam As Long) '加载资源 Dim hRes, hResLoad, hResLock As Long hRes = FindResource(0, lpName, "x") hResLoad = LoadResource(0, hRes) hResLock = LockResource(hResLoad) '将资源写入文件 Dim fp As Long Dim tmp As Long Dim size As Long size = SizeofResource(0, hRes) fp = CreateFile(lpName, GENERIC_WRITE, 0, vbNull, CREATE_ALWAYS, 0, 0) WriteFile fp, hResLock, size, tmp, vbNull '文件被释放,返回1继续枚举 EnumNamesFunc = 1 End Function EnumResourceNames vbNull, "x", EnumResNameProc, 0 End Sub
不好易思,小弟不才,错误可能很多,见笑了!
------解决方案--------------------
这位兄台,函数定义不可以嵌套哦,就是说EnumResNameProc的定义不可以放在Form_Load()
里面的。EnumResNameProc是一个回调函数,就是说Windows来调用它,在VB里,这个函数只能放在模块里,然后在函数EnumResourceNames中用AddressOf关键字调用。