本人要做一个DLL,提供一些基本数据输入功能,并且需要有对话框界面,怎么做呢? 
对话框做过,mfc库DLL也做个,但合起来就不知道怎么做?
DLL能够调用对话框资源,  仅仅显示了这个对话框。不能向它的控件中编辑信息,请问该如何调用这些控件,dll的导出函数又该加上什么呢

解决方案 »

  1.   

    在dll,main里面加上AFX_MANAGE_STATE(AfxGetStaticModuleState());
      

  2.   

    做dll的时候选MFC扩展dll就可以了,然后在对话框类前面加上__declspec(dllexport)直接导出对话框类。
      

  3.   

    创建一个MFC DLL项目,添加对话框资源并添加对话框类,需要显示的时候构造对话框类对象,调用DoModal。
      

  4.   

    DLL对话框还是需要有exe资源来调用呀,而且DLL使用MFC和exe道理是一样的,保密性和可扩展性还要好一点。
    你可以这样子做:
    1.建立一个Shared MFC DLL工程,加入工程名字叫MyDLL,在里边添加一个对话框资源,一般直接添加会默认为IDD_DIALOG1,假使我们就使用这个ID吧;
    2.在添加的对话框资源上添加你说需要的控件,比如你说需要的输入数据的控件,像EditBox,RichEditBox,ComboBox等等,方法和使用exe一样;
    3.如果你使用VC6,那就CTRL+W类向导给IDD_DIALOG1关联一个类,我们假使这个类为CMyDlg;如果使用VS2005,可以在对话框资源上点击右键,选择“添加类”,然后就可以直接添加了;
    4.在你工程中的MyDLL.cpp中添加代码输出你的DLL对话框,当然你也可以新建一个cpp文件去输出,选择工程自动生成的MyDLL.cpp源文件是因为你可以少写一些包含文件的代码,方法类似下边:
    //先包含你的对话框类头文件:
    #include "MyDlg.h"
    //然后导出:
    extern "C" __declspec(dllexport) void ShowDLL(void)
    {
      AFX_MANAGE_STATE(AfxGetStaticModuleState());
      //如果使用模态对话框,使用下边的代码:
      CMyDlg myDlg;
      myDlg.DoModal();
      //如果使用非模态对话框,使用下边的代码:
      CMyDlg *pMyDlg=new CMyDlg();
      pMyDlg->Create(IDD_DIALOG1,NULL);
      pMyDlg->ShowWindow(SW_SHOW);
    }
    5.编译,可以生成一个.DLL文件和一个.lib文件;
    6.新建一个MFC exe工程,给对话框添加一个按钮IDD_BTN_CALL(或者你直接用系统自动生成的OK按钮也行);
    7.给你的exe工程关联一个类,加入叫CMyExe;
    8.在MyExe.cpp文件开头添加如下代码来导入DLL资源(这里给出一个静态调用DLL的方法,动态的方法要复杂一点,你可以到网上找到方法的):
    #pragma comment(lib,"MyDlg.lib")
    extern "C" __declspec(dllimport) void ShowDLL(void);
    9.在你的OnBtnCall()或者OnOK()函数中写下这句代码就OK了:
    ShowDLL();
      

  5.   

    多谢pigpy做出如此详细的解答。
    按你说的方法,设调用DLL工程为B,创建的DLL工程为A。运行后发现B能够显示A中的 对话框。但是
    A中对话框中的所有消息映射函数的功能都不能在B中实现。
    比如在A中对话框中的消息映射函数如下:
    BEGIN_MESSAGE_MAP(Dialog,CDialog)
    {
          ON_EN_CHANGE(IDC_EDIT1, OnchangeEeit1);
         ON_EN_CLICED(IDC_BUTTON1,OnButton1);
    }
    在B工程下,左键点IDC_BUTTON1,并未实现在A共程中应有的功能。
    void Dialog::OnButton1()
    {
       CEdit* edit=(CEdit*)GetDlgItem(IDD_EDIT1);
       edit->EnableWindow(FALSE);
    }
     请问这是何啊?
      

  6.   

    在编写dll时把对话框的句柄传给dll,这样dll中就能够调用对话框资源.
      

  7.   

    给你的EDIT1关联一个CEdit类型的变量m_edit1,然后在你的BUTTON1的函数中这样写试试看:
    m_edit1.EnableWindow(FALSE);