![]()
Windows XP以降であればShowShareFolderUIを利用することで図のようなフォルダ共有ダイアログを開ける。ShowShareFolderUIはヘッダーとして用意されていないのでLoadLibraryとGetProcAddressを利用して呼ぶ必要がある。
この関数はhParentWndにNULLを指定するとS_OKが返るもののダイアログが表示されないので注意。
![]()
また、指定するフォルダによってはこの図のようにファイル共有ダイアログが開くこともある。
ここではWTLでダイアログベースのアプリケーションを作成。MainDlg.hに必要な実装を追加してプロジェクトを作成した。
//
// フォルダの共有ダイアログを表示する
//
//Windows XP以降で有効。
//hParentWnd == NULLはNG。必ず親ウインドウを指定すること!
//
//アプリケーションの開始時CoInitialize、終了時CoUninitializeが呼ばれていないとNG
//
bool ShowShareFolderUI(HWND hParentWnd,LPCTSTR pszPath)
{
HMODULE hModule;
HRESULT hr;
HRESULT (CALLBACK* pfnShowShareFolderUI)(HWND hwndParent,LPCWSTR pszPath);
if(hParentWnd == NULL)
return false;
hModule = ::LoadLibrary(_T("ntshrui.dll"));
if(hModule == NULL)
return false;
(*(FARPROC*)&pfnShowShareFolderUI) = ::GetProcAddress(hModule,"ShowShareFolderUI");
if(pfnShowShareFolderUI)
{
#ifdef UNICODE
hr = pfnShowShareFolderUI(hParentWnd,pszPath);
#else
{
////////////////////////////////
//char*からWCHAR*へ変換
//
WCHAR* pszWchar;
{
int nLen;
//Unicodeに必要な文字数の取得
nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszPath,-1,NULL,0);
pszWchar = new WCHAR[nLen];
if(pszWchar)
{
//変換
nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszPath,(int)::strlen(pszPath)+1,pszWchar,nLen);
if(nLen == 0)
{
delete pszWchar;
pszWchar = NULL;
}
}
}
hr = pfnShowShareFolderUI(hParentWnd,pszWchar);
delete pszWchar; //処理が終わったらdelete
}
#endif
}
else
hr = E_FAIL;
::FreeLibrary(hModule);
return SUCCEEDED(hr) ? true : false;
}
■MainDlg.hのOnInitDialog()内に追加
ShowShareFolderUI(m_hWnd,_T("c:\\"));
ShowShareFolderUI(m_hWnd,_T("c:\\_down"));
