디렉토리가 VB6의 재활용 빈이라고 어떻게 말할 수 있습니까?
-
16-09-2019 - |
문제
코드를 입력하려고합니다 이 기사 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
제휴하지 않습니다 StackOverflow