操作剪贴板的问题。

xiaotuzi 2012-04-13 04:28:41
'各位前辈,问题在语句的后面注释里面,帮忙看看。。
Option Explicit

Private Const CF_HDROP = 15

Private Type POINT
x As Long
y As Long
End Type

Private Type DROPFILES
pFiles As Long
pt As POINT
fNC As Long
fWide As Long
End Type

Private 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 Long

Private 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 Long

Private 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 Sub

Private Sub Command1_Click()
1 Call ShowFilesOnClipboard
End Sub


Private Sub showMewnd_Click()
1 Text1.Text = Me.hwnd
2 Text2.Text = Null

End Sub
...全文
102 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaotuzi 2012-04-16
  • 打赏
  • 举报
回复
非常感谢。
东方之珠 2012-04-16
  • 打赏
  • 举报
回复
'这里在做些啥事情啊?
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


worldy 2012-04-13
  • 打赏
  • 举报
回复
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 的值


1,486

社区成员

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

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