分类: C/C++
2009-05-24 16:07:07
² 现在实现一个IAECommand接口。在类视图中,找到“CMyTestCommand”,按鼠标右键,选择增加接口命令。
² 在接下来的向导中,“实现接口位置”选择“注册表”。在可用类型库列表中找到AEMap的接口定义(如果没有找到,说明AEBase.dll没有注册到系统中,需要注册。)。注意,类型库的名称是“AEBase 1.0 类型库”。然后添加“IAECommand”到“实现接口”中去,然后完成该向导。
² 通过上述步骤,添加了IAECommand接口,接下来,实现该接口函数。代码如下
// CMyTestCommand
class ATL_NO_VTABLE CMyTestCommand :
public CComObjectRootEx
public CComCoClass
public IMyTestCommand,
public IAECommand
{
public:
CMyTestCommand()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_MYTESTCOMMAND)
BEGIN_COM_MAP(CMyTestCommand)
COM_INTERFACE_ENTRY(IMyTestCommand)
COM_INTERFACE_ENTRY(IAECommand)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
// IAECommand Methods
public:
STDMETHOD(GetEnabled)(BOOL * pVal)
{
return E_NOTIMPL;
}
STDMETHOD(GetChecked)(BOOL * pVal)
{
return E_NOTIMPL;
}
STDMETHOD(GetCaption)(BSTR * caption)
{
return E_NOTIMPL;
}
STDMETHOD(GetTooltip)(BSTR * tooltip)
{
return E_NOTIMPL;
}
STDMETHOD(GetCategory)(BSTR * category)
{
return E_NOTIMPL;
}
STDMETHOD(GetIcon)(OLE_HANDLE * icon)
{
return E_NOTIMPL;
}
STDMETHOD(OnCreate)(LPUNKNOWN hook)
{
return E_NOTIMPL;
}
STDMETHOD(OnMouseDown)(long button, long shift, long x, long y)
{
return E_NOTIMPL;
}
STDMETHOD(OnMouseMove)(long button, long shift, long x, long y)
{
return E_NOTIMPL;
}
STDMETHOD(OnMouseUp)(long button, long shift, long x, long y)
{
return E_NOTIMPL;
}
STDMETHOD(OnClick)()
{
return E_NOTIMPL;
}
STDMETHOD(OnKeyDown)(long keycode, long shift)
{
return E_NOTIMPL;
}
STDMETHOD(OnKeyUp)(long keycode, long shift)
{
return E_NOTIMPL;
}
STDMETHOD(GetContextMenu)(long type, BSTR * name)
{
return E_NOTIMPL;
}
STDMETHOD(Refresh)()
{
return E_NOTIMPL;
}
STDMETHOD(Deactivate)(BOOL * pVal)
{
return E_NOTIMPL;
}
};
² 可能是VC2005的bug吧,需要手工把接口函数的变量类型“BOOL”修改成“VARIANT_BOOL”。 注意,一定要修改,否则无法编译。最后修改、函数实现完毕,代码如下:
class ATL_NO_VTABLE CMyTestCommand :
public CComObjectRootEx
public CComCoClass
public IMyTestCommand,
public IAECommand
{
public:
CMyTestCommand()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_MYTESTCOMMAND)
BEGIN_COM_MAP(CMyTestCommand)
COM_INTERFACE_ENTRY(IMyTestCommand)
COM_INTERFACE_ENTRY(IAECommand)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
// IAECommand Methods
public:
STDMETHOD(GetEnabled)(VARIANT_BOOL * pVal)
{
*pVal = VARIANT_TRUE;
return S_OK;
}
STDMETHOD(GetChecked)(VARIANT_BOOL * pVal)
{
*pVal = VARIANT_FALSE;
return S_OK;
}
STDMETHOD(GetCaption)(BSTR * caption)
{
CString strVal = _T("MyTestCommand测试");
*caption = strVal.AllocSysString();
return S_OK;
}
STDMETHOD(GetTooltip)(BSTR * tooltip)
{
CString strVal = _T("MyTestCommand测试");
*tooltip = strVal.AllocSysString();
return S_OK;
}
STDMETHOD(GetCategory)(BSTR * category)
{
CString strVal = _T("MyTestCommand测试");
*category = strVal.AllocSysString();
return S_OK;
}
STDMETHOD(GetIcon)(OLE_HANDLE * icon)
{
return S_FALSE; // 没有图标
}
STDMETHOD(OnCreate)(LPUNKNOWN hook)
{
// 不做任何处理
return S_OK;
}
STDMETHOD(OnMouseDown)(long button, long shift, long x, long y)
{
return S_OK;
}
STDMETHOD(OnMouseMove)(long button, long shift, long x, long y)
{
return S_OK;
}
STDMETHOD(OnMouseUp)(long button, long shift, long x, long y)
{
return S_OK;
}
STDMETHOD(OnClick)()
{
::MessageBox(::GetActiveWindow(), _T("测试一个命令"), _T("提示"), MB_OK);
return S_OK;
}
STDMETHOD(OnKeyDown)(long keycode, long shift)
{
return S_OK;
}
STDMETHOD(OnKeyUp)(long keycode, long shift)
{
return S_OK;
}
STDMETHOD(GetContextMenu)(long type, BSTR * name)
{
return S_FALSE; // 不需要把该插件注册到弹出菜单
}
STDMETHOD(Refresh)()
{
return S_OK;
}
STDMETHOD(Deactivate)(VARIANT_BOOL * pVal)
{
*pVal = VARIANT_TRUE;
return S_OK;
}
};