发布到组件服务上的Dll要调用两次DllMain,不知大虾们注意了吗?如果我想在DllMain中初始化我的类效率就会低一半,大虾们有办法克服此弊端吗?

解决方案 »

  1.   

    BOOL WINAPI DllMain(...)
    {
        static int i;
        if(i++ == 0)
        {
            //初始化自己的类。
         }
         //做其他事情
     }
      

  2.   

    DllMain(...)
    {
        static int i;
        if(i++ == 0)
        {
          FILE *stream = fopen("zwz", "w");
      if(stream)
      fclose(stream);
        }
        //其他部分
    }请看这段程序,编译成DLL之后,在组件服务上安装,选择该DLL之后,点“打开”按钮,在按“下一步”按钮之前,
    看system32文件夹zwz已创建,将zwz删去,接着按“下一步”,“完成”按钮,zwz再次创建!大虾能解释原因吗?
      

  3.   

    调用两次DLLMain,是因为组件被两个进程分别载入了。
      

  4.   

    to Analyst
    请教是哪两个进程,如何避免。
      

  5.   

    弊端?
    非也,实在想不出有什么理由要在 DllMain 中初始化数据。
    “在按“下一步”按钮之前,看system32文件夹zwz已创建”大约是被 regsvr32 创建的,“完成时”不太清楚是谁干的,可能还是 regsvr32 干的。调试一下吧。
      

  6.   

    如果不在DllMain中初始化,在何处初始化哪?
    我想在组件服务上安装Dll之后,初始化就已完成。所有请求的客户端都可访问初始化的数据。
      

  7.   

    可以尝试显示的提出一个初始化方法,做一个注册表项或是 ini 文件来记载这个初始化的信息。如果是用 ATL,也可以在对象的 FinalConstruct 时(重载它)来做这个事情,这样的结果是在你的对象第一次访问时可能会有些慢。
      

  8.   

    可以使用load
    因为这个时候, dll 才真正被装载到进程空间.