さて今回、フォルダの中身を取得して列挙するというような機能を作っています。
IShellFolderインターフェイスの実装に挑戦しているのですが、どうしても途中で
アクセス違反が起こってしまいます。
COMコンポーネントに関する知識が全くなく、ネット上に公開されているサンプル等を
参考にコードを組みました。ちゃんと調べたつもりですがひょっとするとクラスやそのメソッドの定義や値、
また更に根本的なところに間違いがあるのかもしれません。
コードを以下に載せます。
なぜ上手くいかないのでしょうか。お手数掛けますがご教唆よろしくお願いします。
コード: 全て選択
Class IShellFolder
Inherits IUnknown
Public
Virtual Function BindToObject(ByRef pidl As *IShellFolder, ByRef pbc As VoidPtr, ByRef riid As GUID, ByRef ppvOut As VoidPtr) As Long
Virtual Function BindToStorage(ByRef pidl As *IShellFolder, ByRef pbc As VoidPtr, ByRef riid As GUID, ByRef ppvOut As VoidPtr) As Long
Virtual Function CompareIDs(lParam As LPARAM, ByRef pidl1 As *IShellFolder, ByRef pidl2 As *IShellFolder) As Long
Virtual Function CreateViewObject(hwndOwner As HWND, ByRef riid As GUID, ByRef ppvOut As VoidPtr) As Long
Virtual Function EnumObjects(hwndOwner As HWND, grfFlags As Long, ByRef ppenumIDList As *IEnumIDList) As Long
Virtual Function GetAttributesOf(cidl As DWord, ByRef apidl As *IShellFolder, rgfInOut As VoidPtr) As Long
Virtual Function GetDisplayNameOf(ByRef pidl As *IShellFolder, uFlags As Long, lpName As String) As Long
Virtual Function GetUIObjectOf(hwndOwner As HWND, cidl As DWord, ByRef apidl As *IShellFolder, ByRef riid As GUID, rgfReserved As DWord, ByRef ppv As VoidPtr) As Long
Virtual Function ParseDisplayName(hwnd As HWND, ByRef pbc As VoidPtr, pwszDisplayName As String, ByRef pchEaten As DWord, ByRef ppidl As *IShellFolder, ByRef pdwAttributes As VoidPtr) As Long
Virtual Function SetNameOf(hwndOwner As HWND, ByRef pidl As *IShellFolder, lpszName As String, uFlags As Long, ByRef ppidlOut As *IShellFolder) As Long
End Class
Class IMalloc
Inherits IUnknown
Public
Virtual Function Alloc(cb As DWord) As VoidPtr
Virtual Function Realloc(ByRef pv As VoidPtr, cb As DWord) As VoidPtr
Virtual Function Free(ByRef pv As VoidPtr) as VoidPtr
Virtual Function GetSize(ByRef pv As VoidPtr) As DWord
Virtual Function DidAlloc(ByRef pv As VoidPtr) As Long
Virtual Function HeapMinimize() As VoidPtr
End Class
Class IEnumIDList
Inherits IUnknown
Public
Virtual Function Clone(ByRef ppenum As *IEnumIDList) As Long
Virtual Function Next(celt As Long, ByRef rgelt As *IEnumIDList, pceltFetched As Long) As Long
Virtual Function Reset() As Long
Virtual Function Skip(celt As Long) As Long
End Class
Type SHFILEINFO
hIcon As HICON
iIcon As Long
dwAttributes As DWord
szDisplayName[MAX_PATH-1] As Byte
szTypeName[80-1] As Byte
End Type
Declare Function SHGetSpecialFolderLocation Lib "Shell32.dll" Alias "SHGetSpecialFolderLocation" (ByVal hwnd As HWND, ByVal nFolder As Long, ByRef pidl As *IShellFolder) As Long
Declare Function SHGetMalloc Lib "shell32.dll" Alias "SHGetMalloc"(ByRef Malloc As *IMalloc) As Long
Declare Function SHGetFileInfo Lib "Shell32" Alias "SHGetFileInfoA"(ByVal pszPath As *IEnumIDList, ByVal dwFileAttributes As Long, ByRef psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
'IShellFolder::EnumObjects()
Const SHCONTF_FOLDERS = &H20
Const SHCONTF_NONFOLDERS = &H40
Const SHCONTF_INCLUDEHIDDEN = &H80
'SHGetSpecialFolderLocation()
Const CSIDL_DESKTOP = &H0&
Const CSIDL_DRIVES = &H11
'SHGetFileInfo()
Const SHGFI_PIDL = &H8
Const SHGFI_DISPLAYNAME = &H200&
Dim CLSID_Desktop = [
&h00021400,
0,
0,
[&hC0, 0, 0, 0, 0, 0, 0, &h46]
]As GUID
Dim IID_IShellFolder = [
&h000214E6,
0,
0,
[&hC0, 0, 0, 0, 0, 0, 0, &h46]
]As GUID
コード: 全て選択
Dim m_pMalloc As *IMalloc
Dim pFolder As *IShellFolder
Dim pEnumIDList As *IEnumIDList
Dim Sfi As SHFILEINFO
Dim Ret As Long
CoInitialize(NULL)
CoCreateInstance(CLSID_Desktop, NULL, CLSCTX_INPROC, IID_IShellFolder, VarPtr(pFolder))
SHGetMalloc(m_pMalloc)
SHGetSpecialFolderLocation(hMainWnd, CSIDL_DESKTOP, pFolder)
pFolder->EnumObjects(hMainWnd, SHCONTF_FOLDERS + SHCONTF_NONFOLDERS + SHCONTF_INCLUDEHIDDEN, pEnumIDList)
While pEnumIDList->Next(1, pEnumIDList, Ret) = 0
SHGetFileInfo(pEnumIDList, 0, Sfi, SizeOf(SHFILEINFO), SHGFI_PIDL + SHGFI_DISPLAYNAME)
MessageBox(0, Sfi.szDisplayName, "", MB_OK)
Wend
pFolder->Release()
pEnumIDList->Release()
m_pMalloc->Release()
CoUninitialize()
[/code]