Chinaunix首页 | 论坛 | 博客
  • 博客访问: 80578
  • 博文数量: 27
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-21 11:32
文章分类

全部博文(27)

文章存档

2010年(3)

2009年(13)

2008年(11)

我的朋友

分类: 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;

   }

};

²        可能是VC2005bug吧,需要手工把接口函数的变量类型“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;

   }

};

 
 
 
 
阅读(762) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~