欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

atl创建avtive

程序员文章站 2024-03-15 23:13:18
...

1.activex无窗口问题(控件在编码过程中要检查m_hWnd是否存在,不然vs可能会出现绘制错乱和崩溃

atl创建avtive

atl窗体通过CComControlBase的内部变量控制,窗体属性,包括onsize事件对应的m_bRecomposeOnResize变量控制窗体变化事件响应。

2.可插入的控件

atl创建avtive

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

atl创建avtive

atl创建avtive

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

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

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

atl创建avtive

或者通过新建断点中的,函数断点和内存断点定位。

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的双工通信契约。创建成功后,控件本身会增加事件接口。控件端事件的实现可以通过,类窗口中的控件类右键“接口实现”,选择实现的接口和模块自动实现后连接点代码。如下:

atl创建avtive

atl创建avtive

atl创建avtive

atl创建avtive

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 CLSID atl