MultiUse的dll依赖module中public变量的问题,描述如下:有一个EXE工程A,以及3个ActiveX dll工程B、C、D,其中A调用B和C,而B和C都调用D,也就是说D是个公用组件。D内部很多函数都依赖模块内的public变量,而D内的类的Instancing属性是MultiUse,所以导致在同一进程内,不管new多少个D,但实质上,它们依赖的Public变量只有一个,会产生冲突,也就是说,B和C创建各自全局的D的对象后,在使用过程中,有可能B初始化D后(D设置相应的模块public变量值),C又初始化D(D又根据C的要求设置相应的模块public变量值),B再调用D的方法,就出错了。请问各位高手,有没有办法在不改变D依赖于模块public变量和B、C只初始化一次D的情况下,解决这个问题?万分感谢!

解决方案 »

  1.   

    假设 D.init 方法会在 B,C 中都调用一次,而你希望只执行一次,则:
    在 D 的公共模块中加入公共变量 isInited as booleanD.init 写为:
    public sub Init()
       if isInited then
          exit sub
       endif   isInited = true  ' 最好再这里标志,最大程度避免 多线程重入
       
       …… 你的初始化代码
    end sub只所以不用 Static 变量,因为你无法假设用户不会创建多个 D 的实例
      

  2.   

    shwen(shwen),谢谢回复!但我这边不能这样做,因为B和C初始化传的参数不一样,要的结果也不一样。继续求救!
      

  3.   

    我觉得这样会不会更好一点,采用接口和多态的方式来完成你需要的功能。1.定义接口:Activedll的是
    publicNotCreate    ---接口用,引用但不创建
    在这里定义你所有的方法但不实现;2.定义你的实体dll;
    引用接口,采用多态实现接口的方法;
    implements 接口dll'
    实现代码
    '
    个人觉得这样合理一些。
      

  4.   

    以上的说法对在VB IDE中的调用是比较合适的;
    但如果你在脚本中调用自定义接口的组建,可能有点小麻烦。
      

  5.   

    因为“不管new多少个D,但实质上,它们依赖的Public变量只有一个”
    所以我以前是通过将模块public变量放在窗体中解决这个问题的。呵呵,水平有限,惭愧。
      

  6.   

    我觉得无法满足你的要求建议
    把 public变量值(D用到的)改为D的成员变量
      

  7.   

    只有将D改为类模块才可以,module他内部的public变量是程序共有的,必定不可以俩次初始化
      

  8.   

    谢谢各位的关注!liyd1978(阿东):其实就是将D中的一个类设为publicNotCreate了,但是在模块中有一个Public变量指向这个类了,导致不同的初始化冲突。xiaoxinghappy:SingleUse只能用于Exe,不能用于dll
      

  9.   

    jhzhou882(狂刀客) 、landongfang(蓝天):改成类模块变量,改动量较大,再帮我想想别的办法,谢谢!