デスクトップのフォルダを取得する.
LPITEMIDLIST pidl ;
if( SHGetSpecialFolderLocation( m_hWnd, CSIDL_DESKTOP, &pidl ) == NOERROR ) {
char path[_MAX_PATH];
if( SHGetPathFromIDList( pidl, path ) ) {
MessageBox( path, "CSIDL_DESKTOPDIRECTORY", MB_OK ) ;
}
}
以下のコードも参考
class CGetDesktopFolder
{
public:
BOOL GetSpecialFolderLocation();
private:
CString m_strDesktopPath;
};
// メンバ変数 m_strDesktopPath に
// デスクトップフォルダのパスを入れる関数
BOOL CGetDesktopFolder::GetSpecialFolderLocation()
{
BOOL fRet = FALSE;
// Get the main windows' handle.
HWND hwndOwner = NULL;
if( NULL != AfxGetMainWnd() ) {
hwndOwner = AfxGetMainWnd()->m_hWnd;
// SHGetSpecialFolderLocation() で使用するハンドル
}
// Get the shell's allocator.
LPMALLOC pMalloc;
if( SUCCEEDED( SHGetMalloc(&pMalloc) ) ) {
//* シェルの IMalloc インターフェー
//* スへのポインタを獲得 (1)
//* (IMAlloc のインスタンスが出来た)
// Allocate a buffer to receive information.
LPSTR lpBuffer;
if( NULL != (lpBuffer = (LPSTR)pMalloc->Alloc(MAX_PATH)) ) {
//* IMalloc インターフェースに頼んで
//* (つまり Alloc メソッドを使って)
//* バッファのメモリを確保してもらう
//* (2)
//* (※ C とは書き方が違う)
// Get the PIDL for the Desktop folder.
LPITEMIDLIST pidl;
if( SUCCEEDED(SHGetSpecialFolderLocation(
hwndOwner,
CSIDL_DESKTOPDIRECTORY,
&pidl)) ) {
//* ここでは、
//* SHGetSpecialFolderLocation() が
//* IMalloc インターフェースを介して
//* pidl のメモリを確保している (3)
// Get the file system path.
if( SHGetPathFromIDList(pidl, lpBuffer) ) {
m_strDesktopPath = lpBuffer;
fRet = TRUE; //* SUCCESS!! (^^) *//
}
// Free the memory block for pidl.
pMalloc->Free(pidl); //* pidl のメモリを解放 (3)
//* (IMalloc の Free メソッド)
}
// Free the memory block for lpBuffer.
pMalloc->Free(lpBuffer); //* バッファのメモリを解放 (2)
}
// Release the shell's allocator.
pMalloc->Release(); //* IMalloc インターフェースへの
//* ポインタを解放 (1)
//* (IMalloc の Release メソッド)
}
return fRet;
}
参照
デスクトップのハンドル
デスクトップへショートカット登録
スタートメニューのパス