假设 EnumResourceTypes 这个函数吧。。枚举资源类型的,
MSDN链接:
http://msdn.microsoft.com/en-us/library/ms648039(VS.85).aspx其回调函数为 EnumResTypeProc 3个参数分别为 句柄、资源类型、用户自定义传入参数只要回调一直返回 TRUE 就会每次得到一个资源类型,一直到枚举结束我现在要实现的是:在 EnumResourceTypes 这个主函数的过程里,怎么可以得到回调函数中的 资源类型:
至于是 每次都传回来 还是枚举完毕后一次性传回来都可以,但是要求是不能使用全局及模块级变量我的思路是在主函数过程中设置一个变量,并把其内存指针作为 “用户自定义参数”传递到回调函数中,然后回调函数根据这个内存地址将每次得到的 资源类型 数据写到这个地址,最后当主函数过程枚举结束后,从这个地址就可以得到枚举的所有结果了我感觉这个思路是可以实现的,但是写了几次都不成功,请大家帮帮忙,谢谢!!!

解决方案 »

  1.   

    嘿,这个函数跟EnumWindows差不多,不过LZ想得真离奇啊,不能使用全局变量统计
    不过LZ的思路是行得通的,关键是你最后一个参数的问题,我推荐你使用String类型并传值StrPtr。每次枚举完成后加入字符串
    我没试验过哈,如果不行,LZ可以传值字节集数据,这个几乎是万能的,然后每次枚举都ReDim Preserve开辟新的缓存,完成后使用RtlMoveMemory从新写内存即可。
      

  2.   

    我刚才测试了一下,有一个SB的问题先把当前试验结果发上来,然后去找大虾交流下,看看能否解决Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Ptr As Long, RetVal As Long)
    Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As Long, ByVal NewVal As Long)
    Private Declare Function EnumWindows& Lib "user32" (ByVal EnumFunc As Long, ByVal Param As Long)Public Sub EnumProc(ByVal Hwnd As Long, ByVal Param As Long)
    Dim i&, j&, Temp&, Desk&()
    ReDim Preserve Desk(i)
    Desk(i) = Hwnd
    i = i + 1
    PutMem4 Param + j, Hwnd '这里开始写内存
    GetMem4 Param + j, Temp
    Debug.Print Temp  '这里可以完美出现
    j = j + 4 '每次加4,代表数组的下一个成员
    End SubPublic Sub test()
    Dim Temp&(1024)
    EnumWindows AddressOf EnumProc, VarPtr(Temp(0)) '开始指针
    MsgBox Temp(0) '问题就是在这里
    MsgBox Temp(1) '奇怪的是明明上面写内存了,但是除了成员0有数据以外其他成员的数据都是0'我们来遍历看看:
    For i = 0 To 1024
    If Temp(i) <> 0 Then MsgBox i '这里仍然只有成员0返回数据,而其他的成员全部是0
    Next'PS,先看看下面的代码:
    'Private Sub Form_Load()
    'Dim temp&(1), b&
    'temp(0) = 1
    'temp(1) = 2
    'PutMem4 VarPtr(temp(0)) + 4, 123
    'GetMem4 VarPtr(temp(1)), b
    'Me.Caption = b
    'End Sub
    '
    '这里这样写的话,第二个成员,就是temp(1)数据变为123,说明成功了!
    '所以我估计貌似过程局部变量可以在其他过程中写内存数据,但貌似写内存的过程结束后,数据就洗白了,但是奇怪的是为什么第一个成员就能保存数据?
    End Sub
      

  3.   

    我已经写成功了,一点问题没有,不过我不是在VB写的,是在易语言里,不知道你听说过没
    来MSDN问问题,可是没有易语言板块,而我在这里只对VB还算熟悉,所以就发在这里了,下面的代码我只在论坛编写,可能有错误(翻译自我的易程序):
    主函数:Dim Temp As String
    Dim sArr() As String
    Temp = Space(4096)'这里设置多少缓冲区看着办,我用于EnumResourceTypes 函数是设置了65536,反正自释放的
    EnumWindows AddressOf EnumProc, VarPtr(Temp)
    sArr = Split(Temp, "|", -1, )'这样就把句柄的字符串形式取回来了,然后自然是可以再建立个LONG数组,再给转换回去了。大致写个意思,易语言里没问题了,估计VB也可以的
    回调函数:Private Sub EnumProc(ByVal Hwnd As Long, ByVal Param As Long)
    Dim Temp As String
    Temp = Replace$(GetStrFromPtrA(Param), vbNullChar, "")
    If Temp = "" Then
        Temp = CStr(Hwnd)
    Else
        Temp = Temp & "|" & CStr(Hwnd)
    EndIf
    Temp = Temp & vbNullChar
    Call lstrcpyA(Param, Temp)'这里是不是要 ByVal 蒙了,测试下就可
    '其他处理代码,如果有的话End Sub
    辅助函数(易语言里直接有这样的函数命令,现在这个是我以前用VB时写的):'获取指定字符串指针包含的字符串文本(以 0 结尾字符串)
    Private Function GetStrFromPtrA(ByVal lpszA As Long) As String
        GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0)
        Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
    End Function