Skip to content

Commit

Permalink
Merge 58ceffe into d65f986
Browse files Browse the repository at this point in the history
  • Loading branch information
Ocelot1210 authored Mar 27, 2021
2 parents d65f986 + 58ceffe commit ac81816
Showing 1 changed file with 66 additions and 48 deletions.
114 changes: 66 additions & 48 deletions sakura_core/util/shell.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,63 +38,81 @@
#include "env/CShareData.h"
#include "env/DLLSHAREDATA.h"
#include "extmodule/CHtmlHelp.h"
#include <wrl.h>

int CALLBACK MYBrowseCallbackProc(
HWND hwnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData
)
/* フォルダ選択ダイアログ */
BOOL SelectDir(HWND hWnd, const WCHAR* pszTitle, const WCHAR* pszInitFolder, WCHAR* strFolderName)
{
switch( uMsg ){
case BFFM_INITIALIZED:
::SendMessage( hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData );
break;
case BFFM_SELCHANGED:
break;
using namespace Microsoft::WRL;

ComPtr<IFileDialog> pDialog;
HRESULT hres;

// インスタンスを作成
hres = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDialog));
if (FAILED(hres)) {
return FALSE;
}
return 0;
}

/* フォルダ選択ダイアログ */
BOOL SelectDir( HWND hWnd, const WCHAR* pszTitle, const WCHAR* pszInitFolder, WCHAR* strFolderName )
{
BOOL bRes;
WCHAR szInitFolder[MAX_PATH];
// デフォルト設定を取得
DWORD dwOptions = 0;
hres = pDialog->GetOptions(&dwOptions);
if (FAILED(hres)) {
return FALSE;
}

wcscpy( szInitFolder, pszInitFolder );
/* フォルダの最後が半角かつ'\\'の場合は、取り除く "c:\\"等のルートは取り除かない*/
CutLastYenFromDirectoryPath( szInitFolder );
// オプションをフォルダを選択可能に変更
hres = pDialog->SetOptions(dwOptions | FOS_PICKFOLDERS | FOS_NOCHANGEDIR | FOS_FORCEFILESYSTEM);
if (FAILED(hres)) {
return FALSE;
}

// 2010.08.28 フォルダを開くとフックも含めて色々DLLが読み込まれるので移動
CCurrentDirectoryBackupPoint dirBack;
ChangeCurrentDirectoryToExeDir();

// SHBrowseForFolder()関数に渡す構造体
BROWSEINFO bi;
bi.hwndOwner = hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = strFolderName;
bi.lpszTitle = pszTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS/* | BIF_EDITBOX*//* | BIF_STATUSTEXT*/;
bi.lpfn = MYBrowseCallbackProc;
bi.lParam = (LPARAM)szInitFolder;
bi.iImage = 0;
// アイテムIDリストを返す
// ITEMIDLISTはアイテムの一意を表す構造体
LPITEMIDLIST pList = ::SHBrowseForFolder(&bi);
if( NULL != pList ){
// SHGetPathFromIDList()関数はアイテムIDリストの物理パスを探してくれる
bRes = ::SHGetPathFromIDList( pList, strFolderName );
// :SHBrowseForFolder()で取得したアイテムIDリストを削除
::CoTaskMemFree( pList );
if( bRes ){
return TRUE;
}else{
return FALSE;
{
WCHAR szInitFolder[MAX_PATH];

wcscpy_s(szInitFolder, _countof(szInitFolder), pszInitFolder);
// フォルダの最後が半角かつ'\\'の場合は、取り除く "c:\\"等のルートは取り除かない

CutLastYenFromDirectoryPath(szInitFolder);

// 初期フォルダを設定
ComPtr<IShellItem> psiFolder;
hres = SHCreateItemFromParsingName(szInitFolder, NULL, IID_PPV_ARGS(&psiFolder));
if (SUCCEEDED(hres)) {
hres = pDialog->SetFolder(psiFolder.Get());
}
}
return FALSE;

// タイトル文字列を設定
hres = pDialog->SetTitle(pszTitle);
if (FAILED(hres)) {
return FALSE;
}

// フォルダ選択ダイアログを表示
hres = pDialog->Show(hWnd);
if (FAILED(hres)) {
return FALSE;
}

// 選択結果を取得
ComPtr<IShellItem> psiResult;
hres = pDialog->GetResult(&psiResult);
if (FAILED(hres)) {
return FALSE;
}

PWSTR pszResult;
hres = psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszResult);
if (FAILED(hres)) {
return FALSE;
}

wcscpy(strFolderName, pszResult);
CoTaskMemFree(pszResult);

return TRUE;
}

/*! 特殊フォルダのパスを取得する
Expand Down

0 comments on commit ac81816

Please sign in to comment.