掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
エクスプローラで選択されているファイルのパスを取得するには? (ID:73653)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
IDispatch とコネクションポイントを使うようです。 #import <shell32.dll> #import <shdocvw.dll> #include <vector> class CTest : public Shell32::DShellFolderViewEvents { public: virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppv) { if (iid == __uuidof(IUnknown)) { _RPT0(_CRT_WARN, "IUnknown\n"); *(IUnknown**)ppv = this; return S_OK; } if (iid == __uuidof(IDispatch)) { _RPT0(_CRT_WARN, "IDispatch\n"); *(IDispatch**)ppv = this; return S_OK; } return E_FAIL; } virtual ULONG STDMETHODCALLTYPE AddRef() { _RPT0(_CRT_WARN, "CTest::AddRef()\n"); return 1; } virtual ULONG STDMETHODCALLTYPE Release() { _RPT0(_CRT_WARN, "CTest::Release()\n"); return 0; } virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* [out] */ UINT *pctinfo){ return E_FAIL; } virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, /* [out] */ ITypeInfo **ppTInfo){ return E_FAIL; } virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( /* [in] */ REFIID riid, /* [size_is][in] */ LPOLESTR *rgszNames, /* [in] */ UINT cNames, /* [in] */ LCID lcid, /* [size_is][out] */ DISPID *rgDispId){ return E_FAIL; } virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS *pDispParams, /* [out] */ VARIANT *pVarResult, /* [out] */ EXCEPINFO *pExcepInfo, /* [out] */ UINT *puArgErr) { _RPT1(_CRT_WARN, "CTest::Invoke(0x%08X)\n", dispIdMember); if (dispIdMember == 0xC8) { SelectionChanged(); } return E_FAIL; } public: CTest(const Shell32::IShellFolderViewDualPtr& shellFolderView) { _RPT0(_CRT_WARN, "CTest::CTest()\n"); m_shellFolderView = shellFolderView; IConnectionPointContainerPtr cpc = m_shellFolderView; IConnectionPointPtr cp; cpc->FindConnectionPoint(__uuidof(Shell32::DShellFolderViewEvents), &cp); cp->Advise(this, &m_cookie); } virtual ~CTest() { _RPT0(_CRT_WARN, "CTest::~CTest()\n"); IConnectionPointContainerPtr cpc = m_shellFolderView; IConnectionPointPtr cp; cpc->FindConnectionPoint(__uuidof(Shell32::DShellFolderViewEvents), &cp); cp->Unadvise(m_cookie); } void CTest::SelectionChanged() { _RPT0(_CRT_WARN, "CTest::SelectionChanged\n"); Shell32::FolderItemsPtr folderItems = m_shellFolderView->SelectedItems(); long count = folderItems->Count; _RPT1(_CRT_WARN, "count = %d\n", count); for (long i = 0; i < count; i++) { Shell32::FolderItemPtr folderItem = folderItems->Item(i); _RPT1(_CRT_WARN, "path = %s\n", (LPCTSTR)folderItem->Path); } } private: Shell32::IShellFolderViewDualPtr m_shellFolderView; DWORD m_cookie; }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ::CoInitialize(0); try { std::vector<CTest*> testContainer; SHDocVw::IShellWindowsPtr shellWindows(__uuidof(SHDocVw::ShellWindows)); long count = shellWindows->Count; _RPT1(_CRT_WARN, "count = %d\n", count); for (long i = 0; i < count; i++) { SHDocVw::IWebBrowser2Ptr webBrowser = shellWindows->Item(i); Shell32::IShellFolderViewDualPtr shellFolderView = webBrowser->Document; if ((bool)shellFolderView) { CTest* test = new CTest(shellFolderView); testContainer.push_back(test); } } ::MessageBox(0, TEXT("Test"), TEXT("Test"), MB_OK); for (i = 0; i < (long)testContainer.size(); i++) delete testContainer[i]; } catch (_com_error& e) { } ::CoUninitialize(); return 0; }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.