vs2017开发ActiveX(主讲OCX)(十)、手动添加自定
2019-06-20 本文已影响0人
5de9e117f2fe
不知大家有没有发现,vs2017在通过类向导添加方法的时候,已经和以前的版本不一样了,我不知vs2017以前的版本是不是正常的,至少我的已经不正常了,刚开始以为不是最新的,我把vs版本更新至最新,还是不行,然后我有吧所有C++的安装包装了,仍然不行,我又两种猜测:一个是因为微软已经不推荐使用ActiveX插件了,所以逐步弱化,到以后的直接不支持,但我感觉这种可能性又不是太大,原因是,添加事件都是一切正常。那么还有一个原因就是vs2017的BUG,我估计这种可能性会大一些,因为个人觉得不是我们漏装了什么插件,毕竟事件都能够正常添加。花了我好多时间,依然没有新发现,如果有人知道了,麻烦告知我一声,谢谢。
下面我们对比一下vs2015和vs2017通过类向导添加方法界面的对比:
进入类向导方法都一样:如下
打开右键
vs2015的添加方法类向导界面:
新建方法名称
定义idl特性
vs2017的添加方法类向导界面:
添加方法
是不是差别特大。。。。。
既然vs2017不能通过类向导添加方法,而我们又需要使用(其实在我以前用vs2010的开发中,后面都是手动添加方法,基本不会用类向导添加,只是现在突然没了,强迫症就觉得总差点什么,哈哈!!!)那么,我们就只有通过手动来添加了。
- 在.idl文件中,申明方法名,并分配特定ID号,
helpstring("method SetSource")
,这一串可以没有,起到一个注释的作用。
[id(2), helpstring("method SetSource")] LONG SetSource(BSTR bstrInfo);
idl
- 头文件.h中,首先定义ID号,要和前面IDL文件中申明ID号对应:
dispidSetSource = 2L,
定义ID号
这里提一下,虽然dispidSetSource和eventidClickCus值都为2L,但不冲突的,一个是方法ID号,一个是事件ID号。
- 接下来就是在头文件中申明方法名:
protected:
LONG SetSource(LPCTSTR bstrInfo);
申明方法名
- 在源文件cpp中,定义调度映射
DISP_FUNCTION_ID(CCreateOcxDemoCtrl, "SetSource", dispidSetSource, SetSource, VT_I4, VTS_BSTR)
定义调度映射
- 最后实现源文件cpp中方法,该干嘛干嘛
LONG CCreateOcxDemoCtrl::SetSource(LPCTSTR bstrInfo)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
...............
return 0;
}
编译注册即可,这里就不给测试的例子了,网上很多,可以通过JS测试,也可以新建C#项目测试,还可以通过MFC自带的ActiveX Control Test Container
测试,这个工具vs2017没了,需要的可以去网上下载编译好的,或者vs2010里面的。不一一细说,教程很多。