Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba DragQueryFile始终返回0_Vba_Powerpoint - Fatal编程技术网

Vba DragQueryFile始终返回0

Vba DragQueryFile始终返回0,vba,powerpoint,Vba,Powerpoint,我正在尝试使用PowerPoint中的VBA访问剪贴板中的文件,但DragQueryFile始终返回0 这里我的代码被截取了 Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal uFormat As Long) As Long Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal uFormat As L

我正在尝试使用PowerPoint中的VBA访问剪贴板中的文件,但DragQueryFile始终返回0

这里我的代码被截取了

Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal uFormat As Long) As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal uFormat As Long) As Long
Private Declare PtrSafe Function OpenClipboard Lib "user32" ( ByVal hwnd As Long) As Long
Private Declare PtrSafe Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" ( ByVal HDROP As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Const CF_HDROP As Long = 15

Private Sub test_clipboard()
Dim nHandle As Long
If IsClipboardFormatAvailable(CF_HDROP) > 0 Then
    If OpenClipboard(0) <> 0 Then
        nHandle = GetClipboardData(CF_HDROP)
        If nHandle <> 0 Then        
            ' Query number of files in clipboard -> returns always 0
            Debug.Print CStr(DragQueryFile(nHandle, GetNumOfFiles, vbNullString, 0)) 
        End If
        CloseClipboard
    End If
End If

End sub
Private Declare PtrSafe函数IsClipboardFormatAvailable Lib“user32”(ByVal uFormat As Long)尽可能长
私有声明PtrSafe函数GetClipboardData Lib“user32”(ByVal uFormat As Long)为Long
私有声明PtrSafe函数OpenClipboard Lib“user32”(ByVal hwnd作为Long)作为Long
私有声明PtrSafe函数DragQueryFile Lib“shell32.dll”别名“DragQueryFileA”(ByVal HDROP为Long,ByVal UINT为Long,ByVal lpStr为String,ByVal ch为Long)为Long
私有声明PtrSafe函数CloseClipboard Lib“user32”(长度为
专用常数CF_HDROP,长度=15
专用子测试_剪贴板()
长得一样暗
如果IsClipboardFormatAvailable(CF_HDROP)>0,则
如果OpenClipboard(0)为0,则
nHandle=GetClipboardData(CF_HDROP)
如果nHandle为0,则
'查询剪贴板中的文件数->始终返回0
打印CStr(DragQueryFile(nHandle,GetNumOfFiles,vbNullString,0))
如果结束
关闭剪贴板
如果结束
如果结束
端接头
我使用的是Windows 10和Office 2013

C#()也有类似的帖子,但我已经把OpenClipboard称为CloseClipboard了


非常感谢您的帮助。

我在tmp_hallenser的评论中得到了它,但我认为最好把它说得更清楚一些

应更改这两个函数定义:

Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal uFormat As Long) As LongPtr
Private Declare PtrSafe Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" ( ByVal HDROP As LongPtr, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
这是必要的,因为HDROP是一个内存地址,因此根据系统的不同,它的大小也会不同


类型LongPtr.

是否正常?发现问题。这是最上面的宣言。刚发现我必须用longptr代替long。现在它开始工作了。所以您可以使用Office x64!这是一个你应该在一开始就揭示的事实:(你知道吗?