browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

《用SDK玩转ActiveX》补遗

Posted by on 2008 年 03 月 21 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

已经不止一位朋友向我咨询过这个问题——《用SDK玩转ActiveX》的源代码在VS2003、VS2005下无法正常运行,错误原因是GetDlgItem无法取到ActiveX控件的窗口容器句柄,因而也就无法为CAxWindow赋值。于是在此补遗,请诸位周知。
ATL 3.0中的ActiveX控件处理机制是这样的:

  1. 调用AtlAxCreateDialog或AtlAxDialogBox之前,检索对话框资源中的所有控件数据。
  2. 如果遇到ActiveX控件,则将其窗口类名称替换为"AtlAxWin"(ATL窗口类名),窗口标题替换为该ActiveX控件的CLSID。
  3. 由于替换成了名为"AtlAxWin"的窗口类,所以对话框创建控件后会依次创建各个容器,再由各个容器自己创建相应的ActiveX控件。

但是从ATL 7.0开始,处理方式变成了:

  1. 调用AtlAxCreateDialog或AtlAxDialogBox之前,检索对话框资源中的所有控件数据。
  2. 如果遇到ActiveX控件,则将该控件数据从对话框资源中剔除。
  3. 在CAxDialogImpl::DialogProc中截获WM_INITDIALOG并创建所有的ActiveX控件。

所以,对于一个使用ATL 7.0编写的含有ActiveX控件的对话框而言,应该使用CAxDialogImpl,而不再是简单的AtlAxCreateDialog或AtlAxDialogBox了。

订阅本站

没有评论

(Required)
(Required, will not be published)