atl创建avtive
1.activex无窗口问题(控件在编码过程中要检查m_hWnd是否存在,不然vs可能会出现绘制错乱和崩溃)
atl窗体通过CComControlBase的内部变量控制,窗体属性,包括onsize事件对应的m_bRecomposeOnResize变量控制窗体变化事件响应。
2.可插入的控件
授权后,IE才能正常显示(某些情况下显示不正常)
第一、二个页面比较重要,主要对idl和类的继承产生影响。第三个页面可以通过对象属性配置
3.c#调用过程中,”未正确注册错误“可能是由于未设置可插入选项或者重复插入后,项目未清理干净,建议新建一个项目试试。winform需要删除obj目录。axHost错误是因为,activex未设置插入属性(见2的设置)
4.atl中指针错误不会异常崩溃,可以通过vs的反汇编查询打印输出提示的异常地址得到具体错误点
或者通过新建断点中的,函数断点和内存断点定位。
5.mfc的通过ddx可以自动绑定activex为成员变量,生成activex的方法调用文件和对象创建方法。不过vs提供的绑定只能生效一次。控件绑定后就不能修改了,可以通过新建项目重新绑定控件后获取到新的activex对象调用文件。
6.atl中自定义数据类型
typedef
[v1_enum, helpstring(
"_WeekDay Enum"
)]
enum
_WeekDay
{
Sunday=0, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}_WeekDay;
typedef
struct
MyStruct
{
int
i;
}MyStruct;
不过接口的返回值,需要手动修改idl文件等到。参数的最后一位形如[out,retval]代表返回值。
自定义数据类型不能再接口中传递,而应该传递接口类型指针,例如
struct AccountInfo
{
LPCWSTR pszId;
LPCWSTR pszPassword;
};
HRESULT GetAccountInfo(AccountInfo *pAccountInfo);
IDL:
interface IAccountInfo
{
HRESULT get_Id(BSTR *pVal);
HRESULT get_Password(BSTR *pVal);
}
HRESULT get_Account(IAccountInfo **pAccountInfo);
当用户使用 get_Account 方法获取这个信息的时候,不是返回自定义数据结构,
返回 IAccountInfo 接口。
你创建一个实现了 IAccountInfo 接口的实例,返回这个实例的这个接口。
用户获取到这个接口后,使用这个接口的方法获取数据。
而不是像 C++ 那样,使用结构的成员来取得数据。
这样在JavaScript 中,
var account = XXX.Account;
var id = account.Id;
var password = account.Password;
7.atl字符串
atl字符串使用BSTR,C++的封装类中_b_str,通过copy方法传出字符串到BSTR。
8.组建异常(IErrorInfo接口)
SetErrorInfo抛出异常
9.连接点
双击类窗口中的接口可以查看编辑的文件,如果双击显示idl文件,就可以在该接口上添加函数接口了。连接点需要atl创建过程中,使用项目支持“连接点”和IPropertyNotifySInk。连接点主要为创建回调函数,类似wcf的双工通信契约。创建成功后,控件本身会增加事件接口。控件端事件的实现可以通过,类窗口中的控件类右键“接口实现”,选择实现的接口和模块自动实现后连接点代码。如下:
10.c#调用过程中,项目obj需要手动删除,否则会有编译错误。MFC调用activex可以ddx绑定控件自动生成接口代码,不过自动生成只能一次,接口有更新,只能重建项目重新绑定,才能自动生成调用activex的代码了。
11.google对activex的支持需要下载安装插件。随着js和html5的发展,现在已经很少看到activex在互联网中应用,处理一些安全级别比较高的场景,比如银行安装插件。一般的场景中,js和html5前端控件,已经完全可是代替activex的应用,而且绘制和扩展性已经浏览器的安全性,都会比activex更好。
12.atl访问IDispatch自动化接口
struct __declspec(uuid("7FA22CB1-D26F-11D0-B260-00A0240CEEA3")) IObj;
CLSID可以通过__uuidof(IObj)获取
atl使用CComDispatchDriver创建自动化对象(mfc使用COleDispatchDriver)
推荐阅读
-
创建第一个ACtiveX程序
-
WEB页面通过ActiveX控件调用DLL动态库(三):VS2013编写ATL DLL(ActiveX)并通过Web调用ATLDLL
-
atl创建avtive
-
WEB页面通过ActiveX控件调用DLL动态库(一):使用VS2013快速创建一个DLL
-
mysql创建100w的数据
-
eclipse中创建JUnit简单实例
-
JUnit创建套件测试
-
Update IoT Device ID To Device Twin Via Azure Function When Azure IoT Hub Device Created- IoT设备创建后使用
-
2-2 创建类与对象
-
ROS开发(一)创建工作空间