各个大侠。先行谢过,请给我一点指示。问题如下:
原来的项目是一个总控模块,三个子模块,都是exe的。现在要把一个子模块变成一个dll,然后全面实现原来的功能。,问题是要在总控模块中真接调原来这个dll中几个类的成员函数,还要让它响应原来的timer,设timer要在总控模块中进行。该如何做呢。急急!!!!!!!!!!!!!!!在线等待

解决方案 »

  1.   

    dll中仍然可以使用原来EXE工程中的大数代码但在使用对话框时注意在构造对话框时注意调用
    AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
      

  2.   

    设timer要在总控模块中进行?
    timer可以是回调函数或是窗口类的成员函数,后者与窗口句柄(HWND)相关。
    将DLL中的导出,exe不就可以直接使用了吗?
      

  3.   

    新建一个MFC的Dll工程然后把原来子模块的文件包含进来编译.
    响应timer,可以把dll中窗口的句柄传进来,然后在主窗口设置定时器
      

  4.   

    在Dll中建立一个线程~
    然后就和WinMain中一样.....
      

  5.   

    在dll中使用dialog与exe中基本相同,使用向导生成一个dll工程一试便知
      

  6.   

    各位大佬,多谢给矛指导,先谢DentistryDoctor,我在引出函数中每一个都用了大侠的指点,但是我在总控模块中用Findwindow();没有推让抓住dll的窗口。在debug中是0。我也没办法了。原来在dll的App的InitInstanceL(),结果在总模块在loadlibaray()后就不动,后来把domodal()屏掉了。程序成功、执行。但是在总控模快中用SetTimer(),不能让dll成功执行Ontimer();
      

  7.   

    dll中用那个timer响应要用callback函数处理,ontimer是gui的mfc的消息映射~~~~~`
      

  8.   

    这个问题并不难啊,在主程序里设置时间器,在主程序的时间器的响应函数里调用DLL里面的函数就行,同时把主窗口的句柄传过去。
      

  9.   

    多谢各位的指点。我的dll是有个CTestDlg,有几个函数如下:
    CTestDlg
    {
           void Scplay(); //控制media play s 要用定时器
           void Scstop();
    }
    CTestDlg::OnTimer()
    {..............
          case 10:
              Scplay();
              break;
           case 20:
               Scstop();
               break;
    }
    然后我定义了
    extern "C" _declspec(dllexport) void mc_Func03(HWND hWnd)     {
    AFX_MANAGE_STATE(AfxGetStaticModuleState( ));   

    g_FinishTimer = SetTimer(hWnd,10, 500,NULL);
    g_nWinampPauseSp = 0;
    CTestDlg::RestoreWinamp(1); \\这个控制winamp,我把它定义成static 的,然后这样引出的。不知道还有其它的引出成员函数方法吗?我用了一个CTestDlg指针,引是引出了。在调用方也引入了,并且dumpbin  也看到了。运行时一加载lib  就报错说函数找不到执行点。我狂晕!!!!!!!!。没办法声明成静态的。可是Scplay(),Scstop()  不能是静态的。        
    TRACE("finish \r\n");
    }在主调方我这样用的。
    case WM_SCRING:

    hWnd_mc = ::FindWindow(NULL, LPCTSTR("MediaPlayerCtrl"));\\这个是CTestDlg  title,在DEBUG下看没有抓到,是0。不知道能抓到吗?
    mc_Func02(hWnd_mc);
    break;
    原来在DLL模块的APP的InitInstance();中有个
    CTestDlg m_Dlg;
    m_pMainWnd = &m_Dlg;
    m_Dlg.DoModal();
    结果主调方一运行,一出来对话框就不动了。后来我把doModal()去掉了。程序成功运行了。
    程序执行后winamp停了 mediaplayer照样在唱。我头都大了。请各位高人们救救我。
      

  10.   

    在DLL模块的APP的InitInstance();中有个
    CTestDlg m_Dlg(CWnd::FromHandle(hWnd));
    m_pMainWnd = &m_Dlg;
    m_Dlg.DoModal();hWnd-->调用程序的窗口句柄,传过来。
      

  11.   

    syy64 多谢大佬指点。可是在下愚钝,当我用::loadlibrary("my.dll")时,系统已经做初骀工作做好了。就算我改写dll的InitInstance();我如何把主调程序的hWnd传给它,让它执行呢?在下实在是有点菜。请大佬不要嫌烦。再给我点指示。
      

  12.   

    CTestDlg m_Dlg(CWnd::FromHandle(hWnd));
    m_pMainWnd = &m_Dlg;
    m_Dlg.DoModal();
    这段程序一定要放在InitInstance()里吗?