VB6中如何判断某个目录是回收站?

发布于 2024-08-10 06:19:34 字数 1534 浏览 8 评论 0原文

我正在尝试将代码移植到 这篇文章 到 VB6,但我遇到了崩溃。我很确定我的错误出在对 SHBindToParent 的调用中 (MSDN 条目),因为 SHParseDisplayName 返回 0 (S_OK) 并且 ppidl 是正在设置。我承认我设置 riid 的机制(我使用了等效类型,UUID)非常丑陋,但我认为更有可能我在 psf 上做错了什么。

Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As ITEMIDLIST, sfgaoIn As Long, sfgaoOut As Long) As Long
Private Declare Function SHBindToParent Lib "shell32" (ByVal ppidl As Long, ByRef shellguid As UUID, ByVal psf As Long, ByVal ppidlLast As Long) As Long

Private Sub Main()
    Dim hr As Long
    Dim ppidl As ITEMIDLIST
    Dim topo As String
    Dim psf As IShellFolder
    Dim pidlChild As ITEMIDLIST
    topo = "c:\tmp\" '"//This VB comment is here to make SO's rendering look nicer.
    Dim iid_shellfolder As UUID
    iid_shellfolder.Data1 = 136422
    iid_shellfolder.Data2 = 0
    iid_shellfolder.Data3 = 0
    iid_shellfolder.Data4(0) = 192
    iid_shellfolder.Data4(7) = 70
    hr = SHParseDisplayName(StrPtr(topo), 0, ppidl, 0, 0)
    Debug.Print hr, Hex(hr)
    hr = SHBindToParent(VarPtr(ppidl), iid_shellfolder, VarPtr(psf), VarPtr(pidlChild)) 'Crashes here
End Sub

I am attempting to port the code in this article to VB6, but I'm experiencing crashing. I'm pretty sure my error is in my call to SHBindToParent (MSDN entry) since SHParseDisplayName is returning 0 (S_OK) and ppidl is being set. I admit my mechanism of setting the riid (I used an equivalent type, a UUID) is pretty ugly, but I think it more likely I'm doing something wrong with psf.

Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As ITEMIDLIST, sfgaoIn As Long, sfgaoOut As Long) As Long
Private Declare Function SHBindToParent Lib "shell32" (ByVal ppidl As Long, ByRef shellguid As UUID, ByVal psf As Long, ByVal ppidlLast As Long) As Long

Private Sub Main()
    Dim hr As Long
    Dim ppidl As ITEMIDLIST
    Dim topo As String
    Dim psf As IShellFolder
    Dim pidlChild As ITEMIDLIST
    topo = "c:\tmp\" '"//This VB comment is here to make SO's rendering look nicer.
    Dim iid_shellfolder As UUID
    iid_shellfolder.Data1 = 136422
    iid_shellfolder.Data2 = 0
    iid_shellfolder.Data3 = 0
    iid_shellfolder.Data4(0) = 192
    iid_shellfolder.Data4(7) = 70
    hr = SHParseDisplayName(StrPtr(topo), 0, ppidl, 0, 0)
    Debug.Print hr, Hex(hr)
    hr = SHBindToParent(VarPtr(ppidl), iid_shellfolder, VarPtr(psf), VarPtr(pidlChild)) 'Crashes here
End Sub

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

久而酒知 2024-08-17 06:19:34

我相信您对 SHBindToParent 的调用正在崩溃,因为您需要传递 long,然后使用返回的指针将内存复制到您的类型中。当我在 google 上搜索 SHBindToParent 函数时,我发现了几篇文章,其中提到了操作系统支持,主要是 95 和 98。当我在 XP SP3 上尝试它时,我收到错误“不支持此类接口”。

以下是我修改代码以通过 GPF 的方法:

Option Explicit

Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, ByVal sfgaoIn As Long, ByRef sfgaoOut As Long) As Long
Private Declare Function SHBindToParent Lib "shell32" (ByVal ppidl As Any, ByRef shellguid As UUID, ByRef psf As Any, ByRef ppidlLast As Any) As Long

Private Type SHITEMID
   cb As Long
   abID As Byte
End Type

Private Type ITEMIDLIST
   mkid As SHITEMID
End Type

Private Type UUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(7) As Byte
End Type


Private Sub Command1_Click()
    Dim hr As Long
    Dim ppidl As Long
    Dim topo As String
    Dim psf As IShellFolder
    Dim pidlChild As Long
    Dim iid_shellfolder As UUID
    Dim lpIDList2 As Long

    topo = "C:\Temp"

    ' create a uuid = {B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC}'
    iid_shellfolder.Data1 = &HB7534046
    iid_shellfolder.Data2 = &H3ECB
    iid_shellfolder.Data3 = &H4C18
    iid_shellfolder.Data4(0) = 190
    iid_shellfolder.Data4(1) = 78
    iid_shellfolder.Data4(2) = 100
    iid_shellfolder.Data4(3) = 205
    iid_shellfolder.Data4(4) = 76
    iid_shellfolder.Data4(5) = 183
    iid_shellfolder.Data4(6) = 214
    iid_shellfolder.Data4(7) = 172

    hr = SHParseDisplayName(StrPtr(topo), ByVal 0&, lpIDList2, ByVal 0&, ByVal 0&)
    ' Debug.Print hr, Hex(hr)'
    hr = SHBindToParent(lpIDList2, iid_shellfolder, psf, pidlChild) 'retuns "No such interface supported" error

End Sub

I believe your call to SHBindToParent is crashing because you need to pass longs, then use the returned pointers to copy the memory into your types. I found several posts when I googled the SHBindToParent function that mentioned OS support, mostly 95 and 98. When I tried it on XP SP3 I got an error "No such interface supported."

Here is how I modified your code to get past the GPF:

Option Explicit

Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, ByVal sfgaoIn As Long, ByRef sfgaoOut As Long) As Long
Private Declare Function SHBindToParent Lib "shell32" (ByVal ppidl As Any, ByRef shellguid As UUID, ByRef psf As Any, ByRef ppidlLast As Any) As Long

Private Type SHITEMID
   cb As Long
   abID As Byte
End Type

Private Type ITEMIDLIST
   mkid As SHITEMID
End Type

Private Type UUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(7) As Byte
End Type


Private Sub Command1_Click()
    Dim hr As Long
    Dim ppidl As Long
    Dim topo As String
    Dim psf As IShellFolder
    Dim pidlChild As Long
    Dim iid_shellfolder As UUID
    Dim lpIDList2 As Long

    topo = "C:\Temp"

    ' create a uuid = {B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC}'
    iid_shellfolder.Data1 = &HB7534046
    iid_shellfolder.Data2 = &H3ECB
    iid_shellfolder.Data3 = &H4C18
    iid_shellfolder.Data4(0) = 190
    iid_shellfolder.Data4(1) = 78
    iid_shellfolder.Data4(2) = 100
    iid_shellfolder.Data4(3) = 205
    iid_shellfolder.Data4(4) = 76
    iid_shellfolder.Data4(5) = 183
    iid_shellfolder.Data4(6) = 214
    iid_shellfolder.Data4(7) = 172

    hr = SHParseDisplayName(StrPtr(topo), ByVal 0&, lpIDList2, ByVal 0&, ByVal 0&)
    ' Debug.Print hr, Hex(hr)'
    hr = SHBindToParent(lpIDList2, iid_shellfolder, psf, pidlChild) 'retuns "No such interface supported" error

End Sub
掀纱窥君容 2024-08-17 06:19:34

我为那些可能需要它的人提供了一个原型。

Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, ByVal sfgaoIn As Long, ByRef sfgaoOut As Long) As Long
Private Declare Function SHBindToParent Lib "shell32" (ByVal ppidl As Any, ByRef shellguid As UUID, ByRef psf As IShellFolder, ByRef ppidlLast As Any) As Long

Private Sub Main()
    Dim iid_shellfolder As UUID
    Dim hr As Long
    Dim ppidl As Long
    Dim topo As String
    Dim psf As IShellFolder
    Dim pidlChild As Long
    Dim lpIDList2 As Long
    Dim pdid As shdescriptionid
    iid_shellfolder.Data1 = 136422
    iid_shellfolder.Data2 = 0
    iid_shellfolder.Data3 = 0
    iid_shellfolder.Data4(0) = 192
    iid_shellfolder.Data4(7) = 70
    Dim bin As UUID
    bin.Data1 = &H645FF040
    bin.Data2 = &H5081
    bin.Data3 = &H101B
    bin.Data4(0) = &H9F
    bin.Data4(1) = &H8
    bin.Data4(2) = &H0
    bin.Data4(3) = &HAA
    bin.Data4(4) = &H0
    bin.Data4(5) = &H2F
    bin.Data4(6) = &H95
    bin.Data4(7) = &H4E

    'topo = "C:\Temp"
    topo = "c:\$Recycle.Bin\S-1-5-21-725345543-1972579041-1417001333-1192\"
    hr = SHParseDisplayName(StrPtr(topo), ByVal 0&, lpIDList2, ByVal 0&, ByVal 0&)
    hr = SHBindToParent(lpIDList2, iid_shellfolder, psf, pidlChild)
    Dim objShell   As shell32.Shell
    Set objShell = CreateObject("Shell.Application.1") 'New Shell32.Shell        win.Shell.SHGetDataFromIDList psf, pidlChild, SHGDFIL_DESCRIPTIONID, pdid, LenB(pdid)
    Ole32.CoTaskMemFree lpIDList2
    Debug.Print equalUUID(pdid.clsid, bin)
end sub

A prototype which I got to work, for those who may need it.

Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, ByVal sfgaoIn As Long, ByRef sfgaoOut As Long) As Long
Private Declare Function SHBindToParent Lib "shell32" (ByVal ppidl As Any, ByRef shellguid As UUID, ByRef psf As IShellFolder, ByRef ppidlLast As Any) As Long

Private Sub Main()
    Dim iid_shellfolder As UUID
    Dim hr As Long
    Dim ppidl As Long
    Dim topo As String
    Dim psf As IShellFolder
    Dim pidlChild As Long
    Dim lpIDList2 As Long
    Dim pdid As shdescriptionid
    iid_shellfolder.Data1 = 136422
    iid_shellfolder.Data2 = 0
    iid_shellfolder.Data3 = 0
    iid_shellfolder.Data4(0) = 192
    iid_shellfolder.Data4(7) = 70
    Dim bin As UUID
    bin.Data1 = &H645FF040
    bin.Data2 = &H5081
    bin.Data3 = &H101B
    bin.Data4(0) = &H9F
    bin.Data4(1) = &H8
    bin.Data4(2) = &H0
    bin.Data4(3) = &HAA
    bin.Data4(4) = &H0
    bin.Data4(5) = &H2F
    bin.Data4(6) = &H95
    bin.Data4(7) = &H4E

    'topo = "C:\Temp"
    topo = "c:\$Recycle.Bin\S-1-5-21-725345543-1972579041-1417001333-1192\"
    hr = SHParseDisplayName(StrPtr(topo), ByVal 0&, lpIDList2, ByVal 0&, ByVal 0&)
    hr = SHBindToParent(lpIDList2, iid_shellfolder, psf, pidlChild)
    Dim objShell   As shell32.Shell
    Set objShell = CreateObject("Shell.Application.1") 'New Shell32.Shell        win.Shell.SHGetDataFromIDList psf, pidlChild, SHGDFIL_DESCRIPTIONID, pdid, LenB(pdid)
    Ole32.CoTaskMemFree lpIDList2
    Debug.Print equalUUID(pdid.clsid, bin)
end sub
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文