怎么把一个工程(里面带有多个对话框)做成DLL,调用后显示主界面?1.我的MFC EXE工程已经写好了,里面有多个对话框和多个类,其中一个主类——CTestDlg是主界面的对话框类显示主界面
CTestDlg dlg;
dlg.DoModal();2.怎么把这个工程做成DLL,导出CTestDlg类,在测试程序里面使用这个——
CTestDlg dlg;
dlg.DoModal();
来显示主界面呢。类可以通过往工程中添加文件加进去,资源(对话框和图标)怎么导入到DLL工程中呢?

解决方案 »

  1.   

    难道我需要把以前的代码和资源在新的DLL工程中重新在写一次吗?   天哪
    太累了啊。
      

  2.   

    编译器,连接器对exe,dll文件处理方式都不一样,前者注重对库的导入,后者注重导出,要想转换难度不小。
    还不如重新作个dll,把需要的类和函数加进去。
      

  3.   

    你把现有工程中CWinApp类InitInstance中的显示对话框的相关代码删除,最后返回TRUE。再把CTestDlg类定义改为:class __declspec(dllexport) CTestDlg : public CDialog,在项目设置中把输出文件改为dll。
    在新的EXE中需要加入CTestDlg的类定义,把dllexport改成dllimport,并包含原有项目的resource.h(或其中用到的定义),导入对应的lib文件。在调用对话框时,需要先调用AfxSetResourceHandle把dll句柄设置为默认资源句柄。感觉这样就差不多了,先试试吧。
      

  4.   

    cnzdgs ——
    我以前的工程是基于对话框的,里面有TabCtrl,并有多个页面。显示主界面的代码在App类中呢,我怎么删除?BOOL CPropertySheetTestApp::InitInstance()
    {
    AfxEnableControlContainer(); // Standard initialization
    // If you are not using these features and wish to reduce the size
    //  of your final executable, you should remove from the following
    //  the specific initialization routines you do not need.#ifdef _AFXDLL
    Enable3dControls(); // Call this when using MFC in a shared DLL
    #else
    Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif CPropertySheetTestDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    // TODO: Place code here to handle when the dialog is
    //  dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: Place code here to handle when the dialog is
    //  dismissed with Cancel
    } // Since the dialog has been closed, return FALSE so that we exit the
    //  application, rather than start the application's message pump.
    return FALSE;
    }
      

  5.   

    warning C4273: '_GetBaseMessageMap' : inconsistent dll linkage.  dllexport assumed.
    warning C4273: 'protected: static struct AFX_MSGMAP const CPropertySheetTestApp::messageMap' : inconsistent dll linkage.  dllexport assumed.你把现有工程中CWinApp类InitInstance中的显示对话框的相关代码删除,最后返回TRUE。再把CTestDlg类定义改为:class __declspec(dllexport) CTestDlg : public CDialog,在项目设置中把输出文件改为dll。
    -----------------------------------------------------
    做了这些工作后出现以上错误,未完
      

  6.   

    你是的VC是哪个版本?
    你原本的CTestDlg是从CDialog类派生的吗?
    错误信息都是警告还是也有错误?
      

  7.   

    我是VC 6,都是cl.exe的Error。你原本的CTestDlg是从CDialog类派生的吗? 
    ------------------------------
    是的
      

  8.   

    从你贴上的错误信息上看不出与CTestDlg类的定义有什么关联。
    你先只改class __declspec(dllexport) CTestDlg : public CDialog这一行,其它都维持原状不变试试,如果出错在到对应代码上看看可能是什么原因。
      

  9.   

    搞定了,现在错误——
    c:\documents and settings\gpw\桌面\test\propertysheettestdlg.h(11) : fatal error C1083: Cannot open include file: 'TabPage1.h': No such file or directory需要我第一个属性页类的头文件,是不是需要把CTestDlg类用到的所有分页类的头文件都加进来?
    还有这个怎么用——AfxSetResourceHandle麻烦了。
      

  10.   

    看你的CTestDlg类定义中用到了TabPage1.h中的哪些定义,如果只是定义了一个CTabPage1类型的指针变量,只要在类定义前面加一行class CTabPage1;就可以了。
    AfxSetResourceHandle(LoadLibrary("这个DLL"));
      

  11.   

    现在已经编译通过了,可以运行了,可是对话框调不出来。。 AfxSetResourceHandle(LoadLibrary("PropertySheetTest.dll"));
    CPropertySheetTestDlg dlg;
    dlg.DoModal();
      

  12.   

    跟踪了一个,
    HINSTANCE ins = LoadLibrary("PropertySheetTest.dll");
    if (ins != NULL)
    {
    AfxSetResourceHandle(ins);
    }
    ----------------------------------------------------------
    以上都好着呢,到了下面这句的时候,Debug报 CPropertySheetTestDlg dlg;
      

  13.   

    报什么错?
    DLL和EXE都用Release编译执行一下试试。
      

  14.   

    Release下
    报了好多这个东西——error LNK2001: unresolved external symbol "public: virtual __thiscall ConfigPage1::~ConfigPage1(void)" (??1CLinkConfig@@UAE@XZ)这些都是我CTestDlg主界面中的分页
      

  15.   

    编译EXE的时候出的?在EXE中用到ConfigPage1类了吗?如果debug编译没有这个错,可能是你在release配置下没有加入lib。
      

  16.   

    是在Release编译时出现的在EXE的测试工程中并没有直接用到ConfigPage1,ConfigPage1是在CTestDlg中用到的,它是CTestDlg中TabCtrl的分页测试工程EXE比较简单,就这几行HINSTANCE ins = LoadLibrary("PropertySheetTest.dll"); 
    if (ins != NULL) 

    AfxSetResourceHandle(ins); 
    } CPropertySheetTestDlg dlg;
    dlg.DoModal();
      

  17.   

    已经加了Lib了    CPropertySheetTestDlg dlg;  —— 跟踪的时候就是到了这句溢出
      

  18.   

    用Release编译,Ctrl-F5执行会出错是吗?
    具体错误信息是什么?
    DLL用Debug编译应该可以跟踪到CPropertySheetTestDlg的构造函数里面。
      

  19.   


    这是没有把DLL里面的类导出吧~~
      

  20.   

    把分页的类导出也还是不行,Debug和Release编译都没错,就是弹不出主界面Debug跟进其构造函数中,出现这个——Unhandled exception in Test.exe : 0xC0000005 : Access Violation
      

  21.   

    并包含原有项目的resource.h(或其中用到的定义),导入对应的lib文件。
    -------------------------------------------------------这个怎么导入?
      

  22.   

    因为对话框类的定义中会用到对话框的资源ID,该资源ID是在DLL项目的resource.h中的。在EXE项目中,你可以包含DLL的resource.h,也可以从中找出资源ID的值直接在类定义中把资源ID替换成值。
    你用Debug编译F5执行,报错的时候选择重试,看一下具体停在那一行,判断一下是哪个指针出了问题,然后再根据代码分析是哪一步导致了这个错误。(都是看MFC的代码)
      

  23.   

    你把EXE文件作为DLL的资源编进去,然后别人调DLL的时候,把这个EXE文件释放出,然后运行~
      

  24.   

    步骤:  
      1、首先要生成一个*.ogx的文件。  
       
            方法:打开包含有所要加的对话框资源的工程。  
                        在视图资源中鼠标右键点击所需的对话框的类  
                        这时,你会看到右键菜单中有个“add   to   gallery”的选项。  
       
                        选择这个选项,则*.ogx文件生成。  
                        生成的文件名会类似你的对话框的类名,只不过中间会多出一些空格   
                             
                        一般情况下是:  
                        c:\program   files\microsoft   visual   studio\common\msdev98\gallery  
                        \[你的工程名]     目录下  
       
      2、接着就是insert这个*.ogx的文件。  
            也就是insert这个对话框资源和这个对话框类  
       
            打开所要加入的工程,选择  
            project->add   to   project->components   and   controls...  
            这时打开的是一个对话框,默认的打开目录就是:  
            c:\program   files\microsoft   visual   studio\common\msdev98\gallery  
            在对话框中选择进入“你的工程名”的目录,你就会看到那个     *.ogx的文件,  
            选择它,然后insert.     最后关闭对话框。  
       
            这时你就会看到那个对话框的类已经出现在你的工程中,  
            再到资源resourceview中的dialog中看看吧,那个对话框的资源已经出现。
      

  25.   

    不需要改什么东西。只要把你的CTestDlg这个类输出就可以了,就像dll里面那样加个输出符号就行,然后其它什么也不用改,编译出来的exe也可以被loadlibrary的,改个后缀就成。
      

  26.   

    以前做过
    是com
      

  27.   

    新建MFC APPWizard[dll]工程
    将需要的所有资源写成dll控件
    然后test的时候新建MFC APPWizard[exe]工程
    拖个button测试
    在OnButtonClick的地方添加
    void CTestModuleDllDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    typedef void (WINAPI * TESTDLL)();

    HINSTANCE hmod;
    hmod = ::LoadLibrary ("你的dll文件路径.dll");
    if(hmod==NULL)
    {
    AfxMessageBox("Fail");
    }
    TESTDLL lpproc;
    lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
    if(lpproc!=(TESTDLL)NULL)
    (*lpproc)();
    FreeLibrary(hmod);
    }
      

  28.   

    sss
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  29.   

    sss
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  30.   

    sss
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html