ファイル共有ダイアログを表示する

test68_01.gif
Windows XP以降であればShowShareFolderUIを利用することで図のようなフォルダ共有ダイアログを開ける。ShowShareFolderUIはヘッダーとして用意されていないのでLoadLibraryとGetProcAddressを利用して呼ぶ必要がある。

この関数はhParentWndにNULLを指定するとS_OKが返るもののダイアログが表示されないので注意。

test68_02.gif
また、指定するフォルダによってはこの図のようにファイル共有ダイアログが開くこともある。


ここではWTLでダイアログベースのアプリケーションを作成。MainDlg.hに必要な実装を追加してプロジェクトを作成した。

■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"));

プロジェクトファイルをダウンロード



カテゴリー「その他」 のエントリー