문제

코드를 입력하려고합니다 이 기사 VB6에, 그러나 나는 충돌을 경험하고 있습니다. 내 오류가 내 전화에 있다고 확신합니다. SHBindToParent (MSDN 항목) 부터 SHParseDisplayName 반환하고 있습니다.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에 대한 당신의 부름이 충돌하고 있다고 생각합니다. 그런 다음 반환 된 포인터를 사용하여 메모리를 당신의 유형에 복사합니다. OS 지원을 언급 한 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

다른 팁

내가 필요로하는 사람들을 위해 내가 일해야 할 프로토 타입.

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