> シェル拡張ってVisual Studioのデバッガででばっぐできないんですね。。。
Windows と DLL のやりとりが理解できればという前提にはなりますが、
explorer の代わりに DLL を呼び出すクライアントを自分で作ってしまえば
デバッグの助けになります。
> MyProgram.1
> (Default) = MyProgram Application
> shellex
> ContextMenuHandler
> MyCommand={00000000-1111-2222-3333-444444444444}
ContextMenuHandlers
{00000000-1111-2222-3333-444444444444}
@=MyCommand
の方がいいです。
環境がないので試せないのですが、explorer.exeにアタッチしたらデバッグでき
ませんか?
VC++2005なら、メニュー「デバッグ - プロセスにアタッチ」
>ロマさん、aetosさん、bunさん
レジストリのどこに登録されているかは、わかりました。
MSDNの説明は英語なんで、どこまで訳して読めるか自信ないです・・・
が、読まないことには進まないので少しずつ読んでみます。
プロセスにアタッチの件ですが、VS2008Express+Vistaの環境でやってみたらだめでした。
。。
会社のVS2005Pro+XPで実施した場合はできました!!
が、デバッガが突如固まることがいっぱいあります。。。
やっぱりExplorer自体にアタッチすることってあんまりよろしくないのでしょうか。
現在は、選択したファイルのパスをとろうと頑張っています。
#CContextMenu::InvokeCommandの引数のLPCMINVOKECOMMANDINFOにディレクトリが
入っているようで、この変数から何関数を使用してとれるのではないかと調査中です。
> 現在は、選択したファイルのパスをとろうと頑張っています。
IShellExtInit::Initialize の第2引数に渡されてくる IDataObject から取得します。
こんな感じ。
> 現在は、選択したファイルのパスをとろうと頑張っています。
IShellExtInit::Initialize の第2引数に渡されてくる IDataObject から取得します。
こんな感じ。
複数選択した場合とかの応用ケースでは、データフォーマットによって処理を分ける必
要があります。
http://msdn.microsoft.com/en-us/library/bb776902.aspx
STDMETHODIMP CContextMenu::Initialize(PCIDLIST_ABSOLUTE pidlFolder,
IDataObject *pdtobj, HKEY hkeyProgID)
{
IEnumFORMATETC * pEnumFormatETC;
HRESULT hr = pdtobj->EnumFormatEtc(DATADIR_GET, &pEnumFormatETC);
if(FAILED(hr))
{
return hr;
}
UINT ucfFileName = RegisterClipboardFormat(CFSTR_FILENAME);
FORMATETC fetc;
ULONG fetched = 0;
while( SUCCEEDED( pEnumFormatETC->Next(1, &fetc, &fetched )) && fetched == 1)
{
TCHAR name[80];
GetClipboardFormatName(fetc.cfFormat, name, _countof(name));
OutputDebugString(name);
OutputDebugString(TEXT(\r\n));
if(fetc.cfFormat == ucfFileName)
{
STGMEDIUM medium;
hr = pdtobj->GetData(&fetc, &medium);
if(FAILED(hr))
{
continue;
}
if(medium.tymed == TYMED_HGLOBAL)
{
OutputDebugString((LPCTSTR)medium.hGlobal);
OutputDebugString(TEXT(\r\n));
}
ReleaseStgMedium(&medium);
}
}
pEnumFormatETC->Release();
return S_OK;
}
簡略化するとこんな感じか。
STDMETHODIMP CContextMenu::Initialize(PCIDLIST_ABSOLUTE pidlFolder,
IDataObject *pdtobj, HKEY hkeyProgID)
{
UINT ucfFileName = RegisterClipboardFormat(CFSTR_FILENAME);
FORMATETC fetc = {ucfFileName, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM medium;
HRESULT hr = pdtobj->GetData(&fetc, &medium);
if(FAILED(hr))
{
return hr;
}
OutputDebugString((LPCTSTR)medium.hGlobal);
OutputDebugString(TEXT(\r\n));
ReleaseStgMedium(&medium);
return S_OK;
}
>aetosさん
サンプルソースのご提示ありがとうございます。
皆さますごいですね。
私もまだまだ精進してプログラミングに励もうと思います。