by かえる » 2006年8月04日(金) 19:24
再三申し訳ありません。
お二方のアドバイスで分かったつもりになっていたのですが、少し修正して試してみるとまた別の場所で
アクセス違反が起こってしまいました。やはりCOMコンポーネントは自分にはハードルが高すぎたでしょうか…
極力自分の力で解決したいと思っているのですが、資料が見つからなくていまいちよく分かりません。
本当に申し訳ないのですが再度質問させていただきます。
以下に自分の不明な点を整理し、コードを一緒に載せてみました。よろしくお願いします。
1.CoCreateInstanceなど、Co~関数にはそれぞれ何の意味があるのでしょうか。
2.IMallocインターフェイスには何か意味があったのでしょうか。
更に、pMalloc->Free(pidl)は失敗してしまいます。
3.マイコンピュータのアイテム名を列挙するよう修正したつもりなのですが、BindToObjectがうまく
いっていないのかpFolderが空のままで、EnumObjectsに失敗してしまいます。
4.GetDisplayNameOfメソッドで取得できるSTRRET構造体の定義の仕方が分かりません。
unionとは共用体というものだそうですがいったいどのようにすればいいのでしょうか。
typedef struct _STRRET
{
UINT uType; // One of the STRRET_* values
union
{
LPWSTR pOleStr; // must be freed by caller of GetDisplayNameOf
LPSTR pStr; // NOT USED
UINT uOffset; // Offset into SHITEMID
char cStr[MAX_PATH]; // Buffer to fill in (ANSI)
} DUMMYUNIONNAME;
} STRRET, *LPSTRRET;
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
Class IShellFolder
Inherits IUnknown
Public
Virtual Function ParseDisplayName(hwnd As HWND, ByRef pbc As VoidPtr, pwszDisplayName As String, ByRef pchEaten As DWord, ByRef ppidl As *ITEMIDLIST, ByRef pdwAttributes As VoidPtr) As Long
Virtual Function EnumObjects(hwndOwner As HWND, grfFlags As Long, ByRef ppenumIDList As *IEnumIDList) As Long
Virtual Function BindToObject(ByRef pidl As *ITEMIDLIST, pbc As VoidPtr, ByRef riid As GUID,ByRef ppvOut As *IShellFolder) As Long
Virtual Function BindToStorage(ByRef pidl As *ITEMIDLIST, ByRef pbc As VoidPtr, ByRef riid As GUID, ByRef ppvOut As VoidPtr) As Long
Virtual Function CompareIDs(lParam As LPARAM, ByRef pidl1 As *ITEMIDLIST, ByRef pidl2 As *ITEMIDLIST) As Long
Virtual Function CreateViewObject(hwndOwner As HWND, ByRef riid As GUID, ByRef ppvOut As VoidPtr) As Long
Virtual Function GetAttributesOf(cidl As DWord, ByRef apidl As *ITEMIDLIST, rgfInOut As VoidPtr) As Long
Virtual Function GetUIObjectOf(hwndOwner As HWND, cidl As DWord, ByRef apidl As *ITEMIDLIST, ByRef riid As GUID, rgfReserved As DWord, ByRef ppv As VoidPtr) As Long
Virtual Function GetDisplayNameOf(ByRef pidl As *ITEMIDLIST, uFlags As Long, ByRef lpName As *STRRET) As Long
Virtual Function SetNameOf(hwndOwner As HWND, ByRef pidl As *ITEMIDLIST, lpszName As String, uFlags As Long, ByRef ppidlOut As *ITEMIDLIST) 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 *ITEMIDLIST) 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 Next(celt As Long, ByRef rgelt As *ITEMIDLIST, pceltFetched As Long) As Long
Virtual Function Skip(celt As Long) As Long
Virtual Function Reset() As Long
Virtual Function Clone(ByRef ppenum As *IEnumIDList) 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
Type STRRET
'・・・?
End Type
Type ITEMIDLIST
mkid As Long
End Type
TypeDef HRESULT = Long
Declare Function SHGetDesktopFolder Lib "shell32.dll" (ByRef pshf As *IShellFolder) As HRESULT
Declare Function SHGetSpecialFolderLocation Lib "Shell32.dll" Alias "SHGetSpecialFolderLocation" (ByVal hwnd As HWND, ByVal nFolder As Long, ByRef pidl As *ITEMIDLIST) As Long
Declare Function SHGetMalloc Lib "shell32.dll" Alias "SHGetMalloc"(ByRef Malloc As *IMalloc) As Long
Declare Sub StrRetToStr Lib "shlwapi.dll" Alias "StrRetToStrA" (ByRef pstr As *STRRET, ByRef pidl As *ITEMIDLIST, ByVal ppsz As BytePtr)
'IShellFolder::EnumObjects()
Const SHCONTF_FOLDERS = &H20
Const SHCONTF_NONFOLDERS = &H40
Const SHCONTF_INCLUDEHIDDEN = &H80
'IShellFolder::GetDisplayNameOf
Const SHGDN_FORPARSING = &H8000
'SHGetSpecialFolderLocation()
Const CSIDL_DESKTOP = &H0&
Const CSIDL_DRIVES = &H11
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 pDTFolder As *IShellFolder
Dim pFolder As *IShellFolder
Dim pMalloc As *IMalloc
Dim pEnumIDList As *IEnumIDList
Dim pidl As *ITEMIDLIST
Dim Ret As Long
Dim FileName as BytePtr
Dim StrRet As *STRRET
CoInitialize(NULL)
CoCreateInstance(CLSID_Desktop, NULL, CLSCTX_INPROC, IID_IShellFolder, VarPtr(pFolder))
SHGetMalloc(pMalloc)
SHGetDesktopFolder(pDTFolder)
SHGetSpecialFolderLocation(hMainWnd, CSIDL_DRIVES, pidl)
pDTFolder->BindToObject(pidl, NULL, IID_IShellFolder, pFolder)
pFolder->EnumObjects(hMainWnd, SHCONTF_FOLDERS + SHCONTF_NONFOLDERS + SHCONTF_INCLUDEHIDDEN, pEnumIDList)
While pEnumIDList->Next(1, pidl, Ret) =0
pFolder->GetDisplayNameOf( pidl, SHGDN_FORPARSING, StrRet)
StrRetToStr(StrRet, pidl, FileName)
MessageBox(0,FileName,"確認",MB_OK)
Wend
pMalloc->Free(pidl)
pEnumIDList->Release()
pFolder->Release()
pMalloc->Release()
CoUninitialize()
再三申し訳ありません。
お二方のアドバイスで分かったつもりになっていたのですが、少し修正して試してみるとまた別の場所で
アクセス違反が起こってしまいました。やはりCOMコンポーネントは自分にはハードルが高すぎたでしょうか…
極力自分の力で解決したいと思っているのですが、資料が見つからなくていまいちよく分かりません。
本当に申し訳ないのですが再度質問させていただきます。
以下に自分の不明な点を整理し、コードを一緒に載せてみました。よろしくお願いします。
1.CoCreateInstanceなど、Co~関数にはそれぞれ何の意味があるのでしょうか。
2.IMallocインターフェイスには何か意味があったのでしょうか。
更に、pMalloc->Free(pidl)は失敗してしまいます。
3.マイコンピュータのアイテム名を列挙するよう修正したつもりなのですが、BindToObjectがうまく
いっていないのかpFolderが空のままで、EnumObjectsに失敗してしまいます。
4.GetDisplayNameOfメソッドで取得できるSTRRET構造体の定義の仕方が分かりません。
unionとは共用体というものだそうですがいったいどのようにすればいいのでしょうか。
typedef struct _STRRET
{
UINT uType; // One of the STRRET_* values
union
{
LPWSTR pOleStr; // must be freed by caller of GetDisplayNameOf
LPSTR pStr; // NOT USED
UINT uOffset; // Offset into SHITEMID
char cStr[MAX_PATH]; // Buffer to fill in (ANSI)
} DUMMYUNIONNAME;
} STRRET, *LPSTRRET;
[hide]
[code]
Class IShellFolder
Inherits IUnknown
Public
Virtual Function ParseDisplayName(hwnd As HWND, ByRef pbc As VoidPtr, pwszDisplayName As String, ByRef pchEaten As DWord, ByRef ppidl As *ITEMIDLIST, ByRef pdwAttributes As VoidPtr) As Long
Virtual Function EnumObjects(hwndOwner As HWND, grfFlags As Long, ByRef ppenumIDList As *IEnumIDList) As Long
Virtual Function BindToObject(ByRef pidl As *ITEMIDLIST, pbc As VoidPtr, ByRef riid As GUID,ByRef ppvOut As *IShellFolder) As Long
Virtual Function BindToStorage(ByRef pidl As *ITEMIDLIST, ByRef pbc As VoidPtr, ByRef riid As GUID, ByRef ppvOut As VoidPtr) As Long
Virtual Function CompareIDs(lParam As LPARAM, ByRef pidl1 As *ITEMIDLIST, ByRef pidl2 As *ITEMIDLIST) As Long
Virtual Function CreateViewObject(hwndOwner As HWND, ByRef riid As GUID, ByRef ppvOut As VoidPtr) As Long
Virtual Function GetAttributesOf(cidl As DWord, ByRef apidl As *ITEMIDLIST, rgfInOut As VoidPtr) As Long
Virtual Function GetUIObjectOf(hwndOwner As HWND, cidl As DWord, ByRef apidl As *ITEMIDLIST, ByRef riid As GUID, rgfReserved As DWord, ByRef ppv As VoidPtr) As Long
Virtual Function GetDisplayNameOf(ByRef pidl As *ITEMIDLIST, uFlags As Long, ByRef lpName As *STRRET) As Long
Virtual Function SetNameOf(hwndOwner As HWND, ByRef pidl As *ITEMIDLIST, lpszName As String, uFlags As Long, ByRef ppidlOut As *ITEMIDLIST) 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 *ITEMIDLIST) 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 Next(celt As Long, ByRef rgelt As *ITEMIDLIST, pceltFetched As Long) As Long
Virtual Function Skip(celt As Long) As Long
Virtual Function Reset() As Long
Virtual Function Clone(ByRef ppenum As *IEnumIDList) 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
Type STRRET
'・・・?
End Type
Type ITEMIDLIST
mkid As Long
End Type
TypeDef HRESULT = Long
Declare Function SHGetDesktopFolder Lib "shell32.dll" (ByRef pshf As *IShellFolder) As HRESULT
Declare Function SHGetSpecialFolderLocation Lib "Shell32.dll" Alias "SHGetSpecialFolderLocation" (ByVal hwnd As HWND, ByVal nFolder As Long, ByRef pidl As *ITEMIDLIST) As Long
Declare Function SHGetMalloc Lib "shell32.dll" Alias "SHGetMalloc"(ByRef Malloc As *IMalloc) As Long
Declare Sub StrRetToStr Lib "shlwapi.dll" Alias "StrRetToStrA" (ByRef pstr As *STRRET, ByRef pidl As *ITEMIDLIST, ByVal ppsz As BytePtr)
'IShellFolder::EnumObjects()
Const SHCONTF_FOLDERS = &H20
Const SHCONTF_NONFOLDERS = &H40
Const SHCONTF_INCLUDEHIDDEN = &H80
'IShellFolder::GetDisplayNameOf
Const SHGDN_FORPARSING = &H8000
'SHGetSpecialFolderLocation()
Const CSIDL_DESKTOP = &H0&
Const CSIDL_DRIVES = &H11
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 pDTFolder As *IShellFolder
Dim pFolder As *IShellFolder
Dim pMalloc As *IMalloc
Dim pEnumIDList As *IEnumIDList
Dim pidl As *ITEMIDLIST
Dim Ret As Long
Dim FileName as BytePtr
Dim StrRet As *STRRET
CoInitialize(NULL)
CoCreateInstance(CLSID_Desktop, NULL, CLSCTX_INPROC, IID_IShellFolder, VarPtr(pFolder))
SHGetMalloc(pMalloc)
SHGetDesktopFolder(pDTFolder)
SHGetSpecialFolderLocation(hMainWnd, CSIDL_DRIVES, pidl)
pDTFolder->BindToObject(pidl, NULL, IID_IShellFolder, pFolder)
pFolder->EnumObjects(hMainWnd, SHCONTF_FOLDERS + SHCONTF_NONFOLDERS + SHCONTF_INCLUDEHIDDEN, pEnumIDList)
While pEnumIDList->Next(1, pidl, Ret) =0
pFolder->GetDisplayNameOf( pidl, SHGDN_FORPARSING, StrRet)
StrRetToStr(StrRet, pidl, FileName)
MessageBox(0,FileName,"確認",MB_OK)
Wend
pMalloc->Free(pidl)
pEnumIDList->Release()
pFolder->Release()
pMalloc->Release()
CoUninitialize()
[/code]
[/hide]