atl创建avtive

activex无窗口问题

控件在编码过程中要检查m_hWnd是否存在,不然vs可能会出现绘制错乱和崩溃
在这里插入图片描述
atl窗体通过CComControlBase的内部变量控制,窗体属性,包括onsize事件对应的m_bRecomposeOnResize变量控制窗体变化事件响应。

可插入的控件

atl创建avtive_第1张图片

授权后,IE才能正常显示(某些情况下显示不正常)

atl创建avtive_第2张图片
atl创建avtive_第3张图片

    第一、二个页面比较重要,主要对idl和类的继承产生影响。第三个页面可以通过对象属性配置
  • 未正确注册错误

c#调用过程中,”未正确注册错误“可能是由于未设置可插入选项或者重复插入后,项目未清理干净,建议新建一个项目试试。winform需要删除obj目录。axHost错误是因为,activex未设置插入属性(见2的设置)

  • atl中指针错误不会异常崩溃,可以通过vs的反汇编查询打印输出提示的异常地址得到具体错误点

在这里插入图片描述
或者通过新建断点中的,函数断点和内存断点定位。

  • mfc的通过ddx可以自动绑定activex为成员变量,生成activex的方法调用文件和对象创建方法。不过vs提供的绑定只能生效一次。控件绑定后就不能修改了,可以通过新建项目重新绑定控件后获取到新的activex对象调用文件。

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;

atl字符串

atl字符串使用BSTR,C++的封装类中_b_str,通过copy方法传出字符串到BSTR。

组建异常(IErrorInfo接口)

 SetErrorInfo抛出异常

连接点

双击类窗口中的接口可以查看编辑的文件,如果双击显示idl文件,就可以在该接口上添加函数接口了。连接点需要atl创建过程中,使用项目支持“连接点”和IPropertyNotifySInk。连接点主要为创建回调函数,类似wcf的双工通信契约。创建成功后,控件本身会增加事件接口。控件端事件的实现可以通过,类窗口中的控件类右键“接口实现”,选择实现的接口和模块自动实现后连接点代码。如下:

atl创建avtive_第4张图片
atl创建avtive_第5张图片
atl创建avtive_第6张图片
atl创建avtive_第7张图片
c#调用过程中,项目obj需要手动删除,否则会有编译错误。MFC调用activex可以ddx绑定控件自动生成接口代码,不过自动生成只能一次,接口有更新,只能重建项目重新绑定,才能自动生成调用activex的代码了。

google对activex的支持需要下载安装插件。随着js和html5的发展,现在已经很少看到activex在互联网中应用,处理一些安全级别比较高的场景,比如银行安装插件。一般的场景中,js和html5前端控件,已经完全可是代替activex的应用,而且绘制和扩展性已经浏览器的安全性,都会比activex更好。

atl访问IDispatch自动化接口

struct __declspec(uuid(“7FA22CB1-D26F-11D0-B260-00A0240CEEA3”)) IObj;
CLSID可以通过__uuidof(IObj)获取
atl使用CComDispatchDriver创建自动化对象(mfc使用COleDispatchDriver)

控件显示

mmc控制台添加,activex控件打开即可
atl创建avtive_第8张图片
或者

  • TstCon32.exe可以在开发中启动,附加activex控件

atl创建avtive_第9张图片

你可能感兴趣的:(mfc,c++,atl,activex)