下記のソースは2010年にC言語で作成した「ミニ時計ランチャー」の一部です。
上記のソースを HSP に移植したソースが下記です。
//------------------------------------------------ // 特殊フォルダを開く //------------------------------------------------ extern BOOL funcOpenSpecial( HWND hDlg, UINT uID ) { BOOL bRet = FALSE; INT nCSIDL; ITEMIDLIST *lpIDL; IMalloc *lpMalloc; switch ( uID ){ CASE MID_OPEN_COMPUTER: nCSIDL = CSIDL_DRIVES; CASE MID_OPEN_DESKTOP: nCSIDL = CSIDL_DESKTOP; CASE MID_OPEN_NETWORK: nCSIDL = CSIDL_NETWORK; CASE MID_OPEN_CONTROL: nCSIDL = CSIDL_CONTROLS; CASE MID_OPEN_DOCUMENT: nCSIDL = CSIDL_PERSONAL; CASE MID_OPEN_PICTURE: nCSIDL = CSIDL_MYPICTURES; CASE MID_OPEN_VIDEO: nCSIDL = CSIDL_MYVIDEO; CASE MID_OPEN_MUSIC: nCSIDL = CSIDL_MYMUSIC; CASE MID_OPEN_DOWNLOAD: return funcOpenSpecialPath( hDlg, CSIDL_PROFILE, TEXT("Downloads") ); CASE MID_OPEN_FAVORITE: nCSIDL = CSIDL_FAVORITES; CASE MID_OPEN_ACCESSORY: return funcOpenSpecialPath( hDlg, CSIDL_STARTMENU, TEXT("Programs\\Accessories") ); CASE MID_OPEN_STARTUP: nCSIDL = CSIDL_STARTUP; CASE MID_OPEN_QLAUNCH: return funcOpenSpecialPath( hDlg, CSIDL_APPDATA, TEXT("Microsoft\\Internet Explorer\\Quick Launch") ); CASE MID_OPEN_RECYCLE: nCSIDL = CSIDL_BITBUCKET; CASE MID_OPEN_HISTORY: nCSIDL = CSIDL_RECENT; CASE MID_OPEN_SENDTO: nCSIDL = CSIDL_SENDTO; DEFAULT: return FALSE; } if ( SHGetMalloc(&lpMalloc) == S_OK ){ if ( SHGetSpecialFolderLocation(hDlg,nCSIDL,&lpIDL) == S_OK ){ SHELLEXECUTEINFO sei = { 0 }; sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.fMask = SEE_MASK_IDLIST; sei.hwnd = hDlg; sei.lpVerb = NULL; sei.lpFile = NULL; sei.lpParameters = NULL; sei.lpDirectory = NULL; sei.nShow = SW_SHOWNORMAL; sei.lpIDList = lpIDL; bRet = ShellExecuteEx( &sei ); lpMalloc->Free( lpIDL ); } lpMalloc->Release(); } return bRet; }
しかし、これを実行すると毎回「ドキュメント」が開き、仮想フォルダの「ごみ箱」が開きません。
#include "Shell32.as" //-------------------------------------- // Win32API関数の呼び出し定義 //-------------------------------------- #uselib "Ole32.dll" #func global CoTaskMemFree "CoTaskMemFree" sptr //-------------------------------------- // 記号定数(API定数) //-------------------------------------- #const global NULL 0 #const global SW_SHOWNORMAL $00000001 #const global SEE_MASK_IDLIST $00000004 //-------------------------------------- // 記号定数(CSIDL) //-------------------------------------- #const global CSIDL_DESKTOP $00000000 ;デスクトップ #const global CSIDL_INTERNET $00000001 ;インターネット(仮想フォルダ) #const global CSIDL_PROGRAMS $00000002 ;プログラム(ファイルシステムディレクトリ) #const global CSIDL_CONTROLS $00000003 ;コントロールパネル(仮想フォルダ) #const global CSIDL_PRINTERS $00000004 ;プリンタ(仮想フォルダ) #const global CSIDL_PERSONAL $00000005 ;マイドキュメント(ファイルシステムディレクトリ) #const global CSIDL_MYDOCUMENTS $00000005 ;〃 #const global CSIDL_FAVORITES $00000006 ;お気に入り(ファイルシステムディレクトリ) #const global CSIDL_STARTUP $00000007 ;スタートアップ(ファイルシステムディレクトリ) #const global CSIDL_RECENT $00000008 ;最近使ったファイル(ファイルシステムディレクトリ) #const global CSIDL_SENDTO $00000009 ;送る(ファイルシステムディレクトリ) #const global CSIDL_BITBUCKET $0000000A ;ごみ箱(仮想フォルダ) #const global CSIDL_STARTMENU $0000000B ;スタートメニュー(ファイルシステムディレクトリ) #const global CSIDL_MYMUSIC $0000000D ;マイミュージック(ファイルシステムディレクトリ) #const global CSIDL_MYVIDEO $0000000E ;マイビデオ //-------------------------------------- // 列挙定数(SHELLEXECUTEINFO) //-------------------------------------- #enum sei_cbSize=0 #enum sei_fMask #enum sei_hwnd #enum sei_lpVerb #enum sei_lpFile #enum sei_lpParameters #enum sei_lpDirectory #enum sei_nShow #enum sei_hInstApp #enum sei_lpIDList #enum sei_lpClass #enum sei_hkeyClass #enum sei_dwHotKey #enum sei_hIcon #enum sei_hMonitor=sei_hIcon #enum sei_hProcess #enum DIM_SHELLEXECUTEINFO #enum SIZE_SHELLEXECUTEINFO=(DIM_SHELLEXECUTEINFO*4) //-------------------------------------- // メイン部 //-------------------------------------- *Main screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE syscolor 15:boxf:color:title "特殊フォルダのオープン by 科学太郎" ;取得 dim pPIDLIST SHGetSpecialFolderLocation hWnd,CSIDL_BITBUCKET,varptr(pPIDLIST) ;開く dim sei,DIM_SHELLEXECUTEINFO sei.sei_cbSize = SIZE_SHELLEXECUTEINFO sei.sei_fMask = SEE_MASK_IDLIST sei.sei_hwnd = hWnd sei.sei_lpVerb = NULL sei.sei_lpFile = NULL sei.sei_lpParameters = NULL sei.sei_lpDirectory = NULL sei.sei_nShow = SW_SHOWNORMAL sei.sei_lpIDList = pLIDLIST ShellExecuteEx varptr(sei) CoTaskMemFree pPIDLIST stop //------------------------------------------------------------------------------ // End of sample306(特殊フォルダのオープン).hsp //------------------------------------------------------------------------------
他の定数を指定しても常に「ドキュメント」が開きます。
どこが間違っているでしょうか?