我试图端口在这个代码文章以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
有帮助吗?

解决方案

我相信你到SHBindToParent通话崩溃,因为你需要传递多头,然后使用返回的指针指向的内存复制到你的类型。我发现了几个帖子,当我用Google搜索,所提到的操作系统的支持,主要是95和98。当我试图在XP SP3我得到一个错误的SHBindToParent功能“不支持此接口。”

下面是我修改了代码,让过去的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

其他提示

一个原型,我开始工作,对于那些谁需要它。

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top