王朝网络
分享
 
 
 

VC++内部COM插件的编程实现

王朝vc·作者佚名  2006-01-17
宽屏版  字体: |||超大  

VC++内部COM插件的编程实现

作者:李晓飞

下载本文示例工程

一、闲聊

首先,在这里向前段时间没来得及回复你们问题的朋友们说声对不起了,这段时间工作实在太忙,我快倒!哈哈!好了,让我们转入正题,今天要谈的话题是COM,稍微深入一点,不知道大家用过C++Test或者Visual

Assistant(可到VC知识库工具栏目下载)之类的软件没有,它们都有个非常引人注目的功能,那就是把它们自身嵌入到VC开发环境中去。这个功能让我痴迷不已,原因只有一个:我想做一个可以嵌入VC开发环境的VC工程解析器(VC/Delphi工程解析器已被收录在VC知识库在线杂志第19期中),这样用户在VC开发环境中就可以直接对当前或所有工程进行各种分析,统计。那么实现它简单吗?简单,Next和Copy即可轻松完成;仅仅这些吗?不是,它的背后还有博大精深的COM做支撑。不管困难与否,还是让我们先试为快。

二、效果图

三、实现步骤:

<3.1>新建一个<DevStudio

Add-in Wizard>类型工程,输入工程名称"CodeAnalyser".

<3.2>进入第二个画面,系统要求用户输入插件的名称和描述信息。并且要求用户选择

是否需要生成工具栏以及是否自动添加VC事件响应代码。

<3.3>点击"Finish"结束向导,进入代码编辑窗口。

在这里我们要说的一点是:该工程引用了ICommands接口,并从该接口上派生出 CCommands类。该类完成了所有用户自定义函数接口,VC应用程序消息响应和VC调试动作的消息响应工作。当我们真正为CCommands类添加成员函数之前我们必须先为ICommands接口添加相应的函数接口声明。在本工程中我总共为ICommands接口添加了两个函数接口,它们名字分别为:GetCurDirCommandMethod和QuitCommandMethod声明如下:(在CodeAnalyer.odl文件中)

interface ICommands : IDispatch

{

// methods

[id(1)] //在Vtable中的函数索引号

HRESULT GetCurDirCommandMethod(); //得到VC当前工作目录

[id(2)] //在Vtable中的函数索引号

HRESULT QuitCommandMethod (); //退出VC编辑器

};

在接口ICommands添加接口函数,那么相应的我们也要在类CCommands中声明和实现ICommands接口函数,函数的内部代码和普通工程代码没什么区别。

//Implement(CCommands类内部接口函数的声明)

public:

STDMETHOD(GetCurDirCommandMethod)(THIS);

STDMETHOD(QuitCommandMethod)(THIS);

//Function Code(Ccommands类内部接口函数的实现)

//得到当前VC开发环境的工作目录[您也可以让它成为你想要实现的功能代码]

STDMETHODIMP CCommands::GetCurDirCommandMethod()

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

VERIFY_OK(m_pApplication-EnableModeless(VARIANT_FALSE));

BSTR bstrCurDir;

m_pApplication-get_CurrentDirectory(&bstrCurDir);

CString str(bstrCurDir);

::MessageBox(NULL, str, "VC工作目录", MB_OK | MB_ICONINFORMATION);

VERIFY_OK(m_pApplication-EnableModeless(VARIANT_TRUE));

return S_OK;

}

//退出VC开发环境

STDMETHODIMP CCommands::QuitCommandMethod()

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

VERIFY_OK(m_pApplication-EnableModeless(VARIANT_FALSE));

if(::MessageBox(NULL,

"您想退出VC++编辑器吗(Y/N)?",

"询问信息...",

MB_YESNO | MB_ICONQUESTION) == IDYES)

m_pApplication-Quit();

VERIFY_OK(m_pApplication-EnableModeless(VARIANT_TRUE));

return S_OK;

}

<3.4>

创建工具栏,连接工具栏按钮事件

所有的幕后工作已经准备就绪,只差个工具栏界面就一切OK了。打开类CDSAddIn,它里面有三个成员函数,其中OnConnection和OnDisconnection成员函数的意义非常重要。它们的意义如下:

<1>OnConnection:插件的初始化任务都在这里完成。如COM服务的启动,工具栏/菜单栏的创建,工具栏按钮/菜单项的添加与修改等等。

<2>OnDisconnection:插件的卸载工作都在这里完成。如COM服务的卸载,工具栏/菜单栏的销毁,释放等等。

了解了它们各自的用途之后我们就可以在相应的消息事件中添加代码了。很显然工具栏的初始化应该在OnConnection事件中完成。

在OnConnection事件中系统首先获得了VC应用程序接口,然后调用一个接口函数:AddCommand来为插件添加命令和命令影射函数。然后再使用另外一个接口函数AddCommandBarButton向工具栏中添加工具栏按钮,其中每个工具栏按钮会和一个命令标志符号相连接,这样就能实现按钮和命令(消息)之间的一一对应。下面是添加一个命令和一个工具栏按钮的代码(如果你要添加多个工具栏按钮只要重复此步骤即可):

LPCTSTR szCommand = _T("GetCurDirCommand");

VARIANT_BOOL bRet;

CString strCmdString;

strCmdString.LoadString(IDS_CMD_STRING);

strCmdString = szCommand + strCmdString;

CComBSTR bszCmdString(strCmdString);

CComBSTR bszMethod(_T("GetCurDirCommandMethod"));

CComBSTR bszCmdName(szCommand); //和下面添加工具栏按钮对应

VERIFY_OK(pApplication-AddCommand(bszCmdString,bszMethod,0,dwCookie,&bRet));

//AddCommand 参数含义:

//bszCmdString:命令字符串。

//bszMethod:Icommands接口函数名。

//第三个参数代表位图偏移量。

//第四和第五个参数分贝为系统参数和返回值(参照MSDN的IApplication介绍)

if (bRet == VARIANT_FALSE)

{

*OnConnection = VARIANT_FALSE;

return S_OK;

}

//添加工具栏按钮

if (bFirstTime == VARIANT_TRUE)

{

VERIFY_OK(pApplication-AddCommandBarButton(dsGlyph, bszCmdName, m_dwCookie));

}

<3.5>

编译,连接及在VC中引入插件

以上就是我们所有的代码工作,接下来赶快Build以下吧。编译通过的话,在你的工程Debug目录下会有个dll文件。然后打开VC编辑器,在VC任何一个工具栏上点击鼠标右键,弹出如下图所示菜单。然后选择”Customize”子菜单,打开如下图所示的工具栏定制窗口:

接着选择该窗口的最后一页"Add-Ins and Macro Files"出现下图所示窗口。

然后点击”Browse...”按钮,这时打开你工程下的Debug目录中的DLL文件,这样你就可以看到你制作的工具栏了。同样你再次打开上面的菜单,这次可以看到多了一个工具栏,并且名字乱七八糟的,怎么改变工具栏的名字呢?方法很简单:打开上面窗口中的”Toolbars”选项页,在工具栏列表框中找到你的工具栏,然后在”Toolbar

name”编辑框中输入你想要的名字即可。再打开上面的菜单看看名字是不是变了,哈哈!

OK,今天的话题就聊到这里,还是老规矩,有什么问题请MAIL给我,再次祝大家学习愉快. Bye!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有