我写了一个全局钩子,放到了dll中,然后又在dll中写了一个导出类,该类在dll中和exe程序中都将被用到。怎末能保证该类只被实例化一次,就是使他成为单态类?

解决方案 »

  1.   

    那就不要导出该类,导出一个函数,从该函数能得到一个该类的实例指针,该指针存在DLL全局区中,在PROCESS_ATTACH里只NEW一次.
      

  2.   

    看看设计模式的单件模式。你的DLL中类的构造函数设为private,这样别人就不能直接new了,然后导出一个函数专门替代new操作产生类实例,在DLL中保证每次调该函数时都是返回同一个实例的地址。
      

  3.   

    好像icelight的想法可以实现,等我回去试一下。
    设成单态没有用,是在两个进程中
      

  4.   

    你可以在你的类中定义一个Mutex,在类的构造函数中创建这个Mutex对象,创建他的时候给他指定一个名称,如你可以在类的构造函数中这样写
    myclass::myclass()
    {
        CString strClassName="SingleInstance";
        // 判断是否有一名为"SingleInstance"的mutex存在
        m_hMutex = OpenMutex (MUTEX_ALL_ACCESS, FALSE, strClassName) ;
        if (m_hMutex == NULL)
        {
          // m_hMutex不存在,表示没有其它实例在运行,创建一个m_hMutex
          m_hMutex = CreateMutex (NULL, TRUE, strClassName) ;
        }
        else
        {
          // 如果m_hMutex存在,表示已经有一个实例在运行,
          // 或者其它的程序创建了一个名为"SingleInstance"的m_hMutex
          ::AfxMessageBox("已经有一个实例在运行!",MB_OK|MB_ICONEXCLAMATION);
          // 结束程序
          return FALSE;
        }
    }
    m_hMutex:在你的类中定义这个句柄希望对你有所帮助!
      

  5.   

    楼上的,有问题阿,你return false了!还是创建了这个对象 ^-^
      

  6.   

    再问一下
    我在我的dll中导出了很多方法,如:Test1,我怎样在我的exe程序中直接调用
    Test1,而不用LoadLibrary?
      

  7.   

    啥也不导出,只导出这个函数:
    void CreateObject(IDatachunk **ppdc)
    {
    static bool isfirst=true;
    if(isfirst)
    {
    *ppdc=new CDatachunk;
    isfirst=false;
    }
    else
    {
     *ppdc=NULL;
    }
    }
    或者像icelight说的那样也不错。
      

  8.   

    感谢大家帮忙!
    我试了下面方法,但是没编译过
    MyClass* __declspec(dllexport)__stdcall  GetMyClass();
    但是这个可以编译通过
    BOOL __declspec(dllexport)__stdcall  GetBOOL();
    icelight的想法应该怎样做?