我有一個名為ValidatorContextMenuHandler的類,它實作了IShellExtInit和IContextMenu介面。
我的 DLL 在注冊表中被參考,并被正確加載到 Windows Explorer 中。我通過在方法被呼叫時創建MessageBoxes來檢查這一點。當我右擊一個檔案時,我也得到了我的ContextMenuHandler被實體化的通知。所以,IShellExtInit::Initialize()確實被呼叫了(實際上是兩次)。我對IShellExtInit::Initialize()的實作是這樣的:
IFACEMETHODIMP ValidatorContextMenuHandler: :Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hKeyProgID)
{
MessageBox(NULL, L "ContextMenuHandler Initialized!"/span>, L "Notice"/span>, MB_OK)。
return S_OK;
}
然而,在這之后,什么也沒有發生。IContextMenu::QueryContextMenu()從未被呼叫,我也找不到原因。QueryContextMenu()的第一行應該會出現一個MessageBox,但是它首先就沒有達到這個點。
我對該方法的實作如下:
我對該方法的實作如下:
STDMETHODIMP ValidatorContextMenuHandler: :QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
MessageBox(NULL, L "QUERYING CONTEXT MENU", L "ValidatorContextMenuHandler: :QueryContextMenu()", MB_OK)。)
//...洗掉了后面不必要的代碼,這樣帖子就不會太長。
}
沒有編譯錯誤,我測驗的 DLL 是最新的版本(用 regsvr32 /u 卸載 DLL,重新啟動 Windows Explorer,用 regsvr32 載入 DLL)。
對于那些想看我的頭檔案的人來說:
#pragma once
#include<Windows.h>/span>
#include<ShlObj.h>/span>
extern UINT g_cObjCount;
class ValidatorContextMenuHandler : public IShellExtInit, IContextMenu
{
protected:
DWORD m_ObjRefCount。
~ValidatorContextMenuHandler()。
public:
ValidatorContextMenuHandler()。
//IUnknown Methods。
ULONG __stdcall AddRef()。
ULONG __stdcall Release();
HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObject);
//IShellExtInit方法。
IFACEMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hKeyProgID)。
//IContextMenu方法。
IFACEMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT* pwReserved, LPSTR pszName, UINT cchMax)。
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO pici)。
STDMETHODIMP QueryContextMenu(HMENU hMenu,UINT indexMenu,UINT idCmdFirst,UINT idCmdLast,UINT uFlags)。
};
uj5u.com熱心網友回復:
我發現了它不作業的原因。很多挫折都是白費的。
在我的ValidatorContextMenuHandler.cpp檔案中,我犯了一個簡單的錯誤。當查詢IContextMenu介面時,我不小心將this投給了IClassFactory,而我應該將其投給IContextMenu。錯了。
之前:
else if (IsEqualIID(riid, IID_IContextMenu))
{
*ppvObject = (IClassFactory*)this;
this->AddRef()。
return S_OK;
After:
else if (IsEqualIID(riid, IID_IContextMenu))
{
*ppvObject = (IContextMenu*)this;
this->AddRef()。
return S_OK;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/327318.html
標籤:
