学习COM有一段时间了,在学习的过程中我首先想到的一个接口函数就是ShowFrame,通过传递父窗口的相关信息,由组件创建一个子窗口。父窗口通过拥有该子窗口的标示自动对子窗口进行外观的调整使之与整个窗口更加融洽。最近的一个项目中我第一次尝试了这种模型。在主程序与COM组件都是使用MFC的环境下进行开发(VC6),其中主程序使用了bcg的界面扩展库。主程序为单视图程序。使用View窗口作为父窗口。在组件创建子窗口。该程序无法再debug编译后正确执行。在组件创建子窗口时发生断言,ASSERT_VALID宏认为父窗口的指针指向一个无效对象。但是我在调用该接口函数之前对该指针使用这个断言却不会出问题。Release编译后可以运行,但是在运行一段时间后整个程序会崩溃。后来我了解到一般产生这种问题的原因是MFC对象的指针与该对象的handle之间的关系不是肯定的,获得MFC对象的handle的方法时GetSafeHandle(),这时由于MFC各对象和Win32Handle之间的映射关系储存在TLS中。可是我并没有用到多线程阿。当时由于进度紧我又改会在主程序中显示子窗口了,没有问题。现在我又如下几个疑惑:
1.这个模型是否可行。
2.假如使用这个模型,我的问题如何解决。
3.使用其他相关类库可否避免这个问题,比如说WTL。
4.用其它的com开发方法可以高定马?                                             谢谢了!

解决方案 »

  1.   

    可以,COM组件中MFC对象动态分配,传父窗口句柄。
      

  2.   

    在保证你的COM是进程内服务的前提下,你可以用VARIANT来传递你的父窗口句柄在你的方法里把它传给COM就行了!
    以前我做过的一个也是象这样的框架,不过我是用ATL的向导生成接口,为了我的方法可以用MFC的类和其它类型的参数我把IDL去掉了,生成自己的只在MFC下用的COM很好用,不过和DLL一样你在COM里要注意你的窗口是不是要有菜单,APP的IDLE要让COM的APP调用,不然你的菜单和工具栏不能变灰.注意如果参数里有资源ID的时候FINDRESOURCE的问题!
      

  3.   

    我觉得在com的边界上传递指针是一件很危险的事情,不过按道理进程内服务器应该是没有问题的吧,不知你的线程参数是怎样设的,是不是和套间的作用有关系呢?但是在他们之间传递窗口句柄应该是最好的了,因为是windows同一管理。