ソフトウェアを開発し続けて早六年。 バグを憎んで人を憎まず。。 株式投資で脱サラをめざすITエンジニアのホームページ......
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Explorerのコンテキストメニューに独自のメニューを追加します。
Shell Extensionとか呼ばれているものです。
ATLとCOMが解っていれば、とても簡単!

自分用のソフトウェアの場合は、SendTo (送る)にショートカットを入れておくだけで
大体の場合は事足りますけど、
人に公開する場合は、こっちのほうがかっこいいです。
===============
ソース本体
===============

001 #pragma once
002 #include "resource.h"
003 #include <comdef.h>
004 #include <shlobj.h>
005 #include "CtxtMenuExample.h"
006
007
008 // CCtxtMenu
009 /*
010 * 注: IContextMenuのGUIDが、VC7/include/comdef.hに定義されていなかった
011 * VC7/PlatformSDK/include/comdef.hには定義されているので、
012 * VC7/PlatformSDK/includeのインクルードファイルとライブラリの優先順位が、
013 * VC7/includeより上である必要がある
014 */
015 class ATL_NO_VTABLE CCtxtMenu :
016 public CComObjectRootEx<CComSingleThreadModel>,
017 public CComCoClass<CCtxtMenu, &CLSID_CtxtMenu>,
018 public IShellExtInit,
019 public IContextMenu
020 {
021 public:
022 CCtxtMenu()
023 {
024 }
025
026 DECLARE_REGISTRY_RESOURCEID(IDR_CTXTMENU)
027
028
029 BEGIN_COM_MAP(CCtxtMenu)
030 COM_INTERFACE_ENTRY(IShellExtInit)
031 COM_INTERFACE_ENTRY(IContextMenu)
032 END_COM_MAP()
033
034
035 DECLARE_PROTECT_FINAL_CONSTRUCT()
036
037 HRESULT FinalConstruct()
038 {
039 return S_OK;
040 }
041
042 void FinalRelease()
043 {
044 }
045
046 public:
047 ///初期化
048 STDMETHOD(Initialize)(LPCITEMIDLIST pidlFolder,
049 IDataObject *pdtobj,
050 HKEY hkeyProgID)
051 {
052 HRESULT res = E_INVALIDARG;
053 FORMATETC fmt = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
054 STGMEDIUM medium = {0};
055 //選択されたアイテムを取得
056 if(FAILED(pdtobj->GetData(&fmt, &medium))){
057 goto finally;
058 }
059 HDROP hDrop = reinterpret_cast<HDROP>(::GlobalLock(medium.hGlobal));
060 if(!hDrop){
061 goto finally2;
062 }
063 //選択されたアイテムの総数を取得
064 UINT selectedCount;
065 selectedCount = ::DragQueryFile(hDrop, -1, NULL, 0);
066 if(0 == selectedCount){
067 goto finally3;
068 }
069 //選択された1番目のファイルパスを取得
070 if(0 == ::DragQueryFile(hDrop, 0, m_fileName, MAX_PATH)){
071 goto finally3;
072 }
073 res = S_OK;
074 finally3:
075 ::GlobalUnlock(&medium.hGlobal);
076 finally2:
077 ::ReleaseStgMedium(&medium);
078 finally:
079 return res;
080 }
081 ///メニュー項目を追加
082 STDMETHOD(QueryContextMenu)(HMENU hMenu,
083 UINT indexMenu,
084 UINT idCmdFirst,
085 UINT idCmdLast,
086 UINT uFlags)
087 {
088 if((uFlags & CMF_NORMAL) != CMF_NORMAL){
089 return S_OK;
090 }
091 ::InsertMenu(hMenu, indexMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst, _T("こんてきすとめにゅー(&M)"));
092 return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 1);
093 }
094 ///メニューがクリックされたとき
095 STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO lpici)
096 {
097 if(0 != HIWORD(lpici->lpVerb)){
098 return E_INVALIDARG;
099 }
100 if(0 == LOWORD(lpici->lpVerb)){
101 ::MessageBox(lpici->hwnd, m_fileName, _T("こんてきすと"), MB_OK);
102 }
103 return S_OK;
104 }
105 ///ステータスバーに表示する文字列の設定
106 STDMETHOD(GetCommandString)(THIS_
107 UINT_PTR idCmd,
108 UINT uType,
109 UINT * pwReserved,
110 LPSTR pszName,
111 UINT cchMax)
112 {
113 if(uType & GCS_HELPTEXT){
114 if(0 == idCmd){
115 LPCTSTR msg = _T("こんてきすとめにゅー.");
116 USES_CONVERSION;
117 if(uType & GCS_UNICODE){
118 lstrcpynW((LPWSTR) pszName, T2CW(msg), cchMax);
119 }else{
120 lstrcpynA(pszName, T2CA(msg), cchMax);
121 }
122 }
123 return S_OK;
124 }
125 return E_INVALIDARG;
126 }
127 private:
128 TCHAR m_fileName[MAX_PATH];
129 };
130 OBJECT_ENTRY_AUTO(__uuidof(CtxtMenu), CCtxtMenu)


============
IDL
IUnknownを実装したシンプルな定義です
============

import "oaidl.idl";
import "ocidl.idl";

[
uuid(70913EAE-9633-4cc0-9F4F-B856FB7B1BEA),
version(1.0),
helpstring("CtxtMenuExample 1.0 タイプ ライブラリ")
]
library CtxtMenuExampleLib
{
importlib("stdole2.tlb");
[
uuid(DBF773E5-11B6-4a51-8803-16F17E0E2624),
helpstring("CtxtMenu Class")
]
coclass CtxtMenu
{
[default] interface IUnknown;
};
};

===============
レジストリスクリプト
COMの通常の設定に加えて以下の記述を入れます
GUIDは対象のCOMコンポーネントのGUIDに書き換えてください
===============

HKCR
{
NoRemove *
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
CtxtExample = s '{DBF773E5-11B6-4a51-8803-16F17E0E2624}'
}
}
}
}
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ


管理者にだけ表示を許可する
http://qnd.blog36.fc2.com/tb.php/18-258c7a60
この記事にトラックバックする(FC2ブログユーザー)
// HOME // 
シャトー・フルール・ド・ジャン・ゲイ・レゼルヴ 2001
↑これ、お気に入りのワインです
毎日ペースで飲んでる中からの
厳選(?)チョイスする予定。。
(ちなみに赤が好き)
カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム
ブログ内検索

RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。