作業中の小さなアプリケーション用に、非常に基本的なシェル拡張機能を開発しました。しばらく問題なく使用していますが、Windows XPの[スタート]メニュー->[すべてのプログラム]で、フォルダを右クリックして[開く]または[探索]を選択すると、エクスプローラウィンドウの代わりに小さなアプリケーションが表示されます。これを見たとき、私がどれほど幸せで誇りに思っていたか想像できます。これが起こる唯一の場所なので、私はそれが奇妙だと思います(これまでのところ...)。シェル拡張機能を「ディレクトリ」レジストリキーで登録したので、フォルダを右クリックしたときにのみ表示されます。
私はシェル拡張に関するいくつかの良い記事を見つけました、そして私はそれらでこれまでにそれを作りました、しかし私はこのwinapiのもので私の快適なゾーンのどこにも近くありません。IDをいじくりまわしましたが、何が問題なのかわかりません。
これが私のquerycontextmenuの実装であり、C++の第一人者がすぐに見つけられるというばかげた間違いをしたことを願っています。どんな助けでもありがたいです。
STDMETHODIMP ShellExtension::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags){
if (CMF_DEFAULTONLY & uFlags)
{
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
}
UINT uID = idCmdFirst;
if (!InsertMenu(hMenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL))
{
return HRESULT_FROM_WIN32(GetLastError());
}
HMENU hSubmenu = CreatePopupMenu();
InsertMenu (hSubmenu, 0, MF_BYPOSITION, uID++, (this->isFrench ? SET_REF_TEXT : SET_REF_TEXT_EN));
InsertMenu (hSubmenu, 1, MF_BYPOSITION, uID++, (this->isFrench ? SET_COMP_TEXT : SET_COMP_TEXT_EN));
MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_BITMAP | MIIM_SUBMENU | MIIM_DATA | MIIM_STRING;
mii.hSubMenu = hSubmenu;
mii.fType = MFT_STRING;
mii.dwTypeData = (this->isFrench ? MAIN_TEXT : MAIN_TEXT_EN);
mii.hbmpItem = IsRequirePainting() ? HBMMENU_CALLBACK : m_hMenuBmp;
mii.wID = uID++;
if (!InsertMenuItem(hMenu, indexMenu, TRUE, &mii))
{
return HRESULT_FROM_WIN32(GetLastError());
}
if (!InsertMenu(hMenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL))
{
return HRESULT_FROM_WIN32(GetLastError());
}
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, uID - idCmdFirst);}
ありがとう!
編集:
これは私のために働いた解決策です...ここでつまずいた人のために:
STDMETHODIMP ShellExtension::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
{
if (!HIWORD(lpcmi->lpVerb))
{
UINT idCmd = LOWORD(lpcmi->lpVerb);
switch (idCmd)
{
case 0:
doStuffForFirstCommand();
break;
case 1:
doStuffForSecondCommand();
break;
}
return S_OK;
}
else
{
return E_INVALIDARG; //this is what I forgot...
}
}
ヘルプに感謝し、コードのインデントをお詫びします。コードタグがわからないようです。