'各位前辈,问题在语句的后面注释里面,帮忙看看。。
Option ExplicitPrivate Const CF_HDROP = 15Private Type POINT
    x As Long
    y As Long
End TypePrivate Type DROPFILES
    pFiles As Long
    pt As POINT
    fNC As Long
    fWide As Long
End TypePrivate Declare Function GlobalSize Lib "kernel32" _
(ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" _
(ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" _
(ByVal hMem As Long) As LongPrivate Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)Private Sub ShowFilesOnClipboard()
    Dim lHandle As Long
1     Dim lpResults As Long
2     Dim lRet As Long
3     Dim df As DROPFILES
4     Dim strDest As String
5     Dim lBufferSize As Long
6     Dim arBuffer() As Byte
7     Dim vNames As Variant
8     Dim i As Long
    
9     If OpenClipboard(0) Then
10         lHandle = GetClipboardData(CF_HDROP)
        ' If you don't find a CF_HDROP, you don't want to process anything
11         If lHandle > 0 Then
12             lpResults = GlobalLock(lHandle)
            
13             lBufferSize = GlobalSize(lpResults)
14             ReDim arBuffer(0 To lBufferSize)
   '问题啊,下面为啥要用2个copymemory?第二个为啥用call? byval lpresults+df.pfiles啥意思?lbuffersize-len(df)代表啥意义?
15             CopyMemory df, ByVal lpResults, Len(df)
16             Call CopyMemory(arBuffer(0), ByVal lpResults + df.pFiles, _
            (lBufferSize - Len(df)))
            
17             If df.fWide = 1 Then
                ' it is wide chars--unicode
18                 strDest = arBuffer
19             Else
20                 strDest = StrConv(arBuffer, vbUnicode)
21             End If
22             GlobalUnlock lHandle'这里在做些啥事情啊?
23             vNames = Split(strDest, vbNullChar)
24             i = 0
25             While Len(vNames(i)) > 0
26                 List1.AddItem vNames(i)
27                 i = i + 1
28             Wend
29         End If
30     End If
31     CloseClipboard
End SubPrivate Sub Command1_Click()
1     Call ShowFilesOnClipboard
End Sub
Private Sub showMewnd_Click()
1     Text1.Text = Me.hwnd
2     Text2.Text = Null
    
End Sub

解决方案 »

  1.   

    12 lpResults = GlobalLock(lHandle)
        
    13 lBufferSize = GlobalSize(lpResults)
    14 ReDim arBuffer(0 To lBufferSize)
      '问题啊,下面为啥要用2个copymemory?第二个为啥用call? byval lpresults+df.pfiles啥意思?lbuffersize-len(df)代表啥意义?15 CopyMemory df, ByVal lpResults, Len(df)
    df是一个目标变量,CopyMemory 将该变量的地址传入
    lpResults的值是由 GlobalSize(lpResults)获得的内存地址,通过Byval关键字,lpResults这个参数传递的值,不是lpResults的地址16 Call CopyMemory(arBuffer(0), ByVal lpResults + df.pFiles, _
      (lBufferSize - Len(df)))
    arBuffer(0)没有被修饰,传递arBuffer(0)的地址
    ByVal lpResults + df.pFiles 传递的是lpResults + df.pFiles 的值    
      

  2.   

    磨刀不误砍柴工,仔细了解一下CopyMemory的参数含义和用法
      

  3.   

    '这里在做些啥事情啊?
    23 vNames = Split(strDest, vbNullChar)  '分割字符串strDest到数组vNames 24 i = 0
    25 While Len(vNames(i)) > 0 '这个循环是将数组vNames 的元素显示到list1中26 List1.AddItem vNames(i)
    27 i = i + 1
    28 Wend
    29 End If
    30 End If
    31 CloseClipboard '清空剪贴板End Sub