さて今回、フォルダの中身を取得して列挙するというような機能を作っています。
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]