比如我创建了一个AxCuImg.ocx的控件,那么MFC的ActiveX向导就会创建一个CAxCuImgApp类,它的父类是COleControlModule,会创建一个CAxCuImgCtrl类,父类是COleControl。那么我在同一个JS页面中,添加2个(或以上)的ocx对象时,好像CAxCuImgApp构造函数只调用了一次,CAxCuImgCtrl调用了2次(或以上),为什么会这样了。
好像实例化时在CAxCuImgApp中会创建一个队列,用来管理CAxCuImgCtrl,为什么会这样呢? 好像和多文档框架有点像?真心讨教ocx创建多个相同实例的内幕问题,以及要注意的地方?求大牛?

解决方案 »

  1.   

    一个wrapper 类,有多个对象
    和int i,j,k;
    一样
      

  2.   


    一个wrapper 类?不太懂。。
      

  3.   

    不知你为何那么用,
    我用的是ocx只加载一次,一个对象你用的每个对象间是独立的?
      

  4.   


    哦,就是现在不知道JS做页面的人,不知道用了什么页面来加载我的ocx,在关闭该页面的时候,CAxCuImgApp类不析构,而CAxCuImgCtrl类析构了的,这样下次再打开该页面的话CAxCuImgApp对象还在,且不是很危险?有时候,一个页面上是希望加载多个对象的
      

  5.   

    模块对应DLL,只会加载一次,所以代表模块的App类只会构造一个对象
    组件代表某个产品,可创建多次,看应用需要多少个组件。就像电视机厂家,厂房只需要一个,里面有生产线设备,可以制造多台电视机。
    厂房 <==> 模块
    生产线设备 <==> 类厂
    电视机 <==> 组件
      

  6.   


    恩,这个我明白, 那么这个APP应该在页面关闭的时候就析构了吧,但是我们的JS不知道是用的什么 frame加载的OCX,切换到其他页面,Ctrl 析构了,但是APP没有析构.
      

  7.   

    只有DLL被卸载时才会析构APP,控件卸载不代表DLL被卸载,即使所有控件都卸载了,DLL也可能会延迟卸载。
      

  8.   

    首先是十分感谢。
    你这里说的卸载是值卸载出内存,还是类似regsvr32 -u XXXocx 这样的撤销在操作系统上的注册呢?为甚么只有卸载才会析构 APP呢? (这个问题好像比较难)
      

  9.   

    模块卸载相当于FreeLibrary,不是指控件在注册表中的注册和反注册。
    只有FreeLibrary导致DLL从进程中清理出去时,App的析构函数才会被调用。一个模块中只有一个全局的App对象,加载模块就会执行App的构造函数,卸载模块就析构。不知道解释明白没