HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0826
科学太郎仮想フォルダがオープンできません。何故でしょうか?5解決


科学太郎

リンク

2018/8/26(Sun) 23:18:20|NO.85219

現在、特殊フォルダ(仮想フォルダ)を開くサンプルを作成中です。
下記のソースは2010年にC言語で作成した「ミニ時計ランチャー」の一部です。

//------------------------------------------------ // 特殊フォルダを開く //------------------------------------------------ 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; }
上記のソースを HSP に移植したソースが下記です。

#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 //------------------------------------------------------------------------------
しかし、これを実行すると毎回「ドキュメント」が開き、仮想フォルダの「ごみ箱」が開きません。
他の定数を指定しても常に「ドキュメント」が開きます。

どこが間違っているでしょうか?



この記事に返信する


科学太郎

リンク

2018/8/26(Sun) 23:18:41|NO.85220




Velgail

リンク

2018/8/26(Sun) 23:43:37|NO.85221

以下のコードで動きます

exec "cmd /c start shell:RecycleBinFolder"
(参考:https://www.blackcat.xyz/article.php/FAQWin_WinMgr_OpenSpecialFolderCmd)



科学太郎

リンク

2018/8/27(Mon) 00:05:31|NO.85222

Velgailさん
情報ありがとうございます。

色々な方法で「仮想フォルダ」を開くことが可能なようですね。
しかし、現在行ってる HSP への移植処理では、仮想フォルダのアイコンも取得して
メニューなどに表示するのが目的です。

つまり、仮想フォルダを開くだけであれば、紹介URLで十分でしょう。
でも、アイコンを取得するには、ShellExecuteEx 関数を使います。

よって、上記のソースで仮想フォルダが上手にオープンできると
同時にアイコン・ハンドルも取得可能という事になります。



MillkeyStars

リンク

2018/8/27(Mon) 00:27:06|NO.85223

普通に、ShellExecuteEx を pLIDLIST で開く方法とフォルダを指定する方法で開けばいいんじゃないかなー。
ゴミ箱(仮想フォルダ)なら、CLSID (CLSID文字列をフォルダ名として)を指定して開く。

//以下一部スクリプト抜粋、CLSID として開くサンプル

//CSLID を直接指定して開く VerbStr = "explore" FolderPath = "::{645FF040-5081-101B-9F08-00AA002F954E}" //ゴミ箱の仮想フォルダ ;開く dim sei,DIM_SHELLEXECUTEINFO sei.sei_cbSize = SIZE_SHELLEXECUTEINFO sei.sei_fMask = SEE_MASK_IDLIST sei.sei_hwnd = hWnd sei.sei_lpVerb = varptr(VerbStr) sei.sei_lpFile = varptr(FolderPath) sei.sei_lpParameters = NULL sei.sei_lpDirectory = NULL sei.sei_nShow = SW_SHOWNORMAL sei.sei_lpIDList = NULL ShellExecuteEx varptr(sei) CoTaskMemFree pPIDLIST stop



科学太郎

リンク

2018/8/27(Mon) 00:51:02|NO.85224

原因が判明しました。


#cmpopt varinit 1
上記の1行目をサンプル・ソースの1行目に挿入します。

#未初期化の変数があります(plidlist) sample300().hsp(77) : error 39 : 未初期化変数を使用しようとしました (77行目) --> sei.9 = plidlist
このようなエラーが出ます。

つまり、変数のスペル・ミスでした。
よって、サンプル・ソース77行目の
「pLIDLIST」を
「pPIDLIST」に編集します。

これで「ごみ箱」フォルダが開けました。



ONION software Copyright 1997-2021(c) All rights reserved.