实现目的:用户程序中调用DLL时,DLL创建一个对话框指针,然后在后台运行;
例子:
DLL(MFC扩展)文件:在APP里 CDcuDlg * pDlg;__declspec(dllexport) void _stdcall  Show_DCUDialog(  )    //导出函数
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());
  pDlg->ShowWindow( SW_NORMAL);}
BOOL CDCUApp::InitInstance()       //DLL入口创建
{ pDlg = new CDcuDlg;
pDlg->Create( IDD_DCU );
pDlg->ShowWindow( SW_HIDE );
         pDlg = pDCUdialog;
return CWinApp::InitInstance();
}int CDCUApp::ExitInstance()  
{ pDlg->DestroyWindow();
delete pDlg;

return CWinApp::ExitInstance();
}
如果是对话框程序调用这个DLL ,pDlg可以正常被创建。但是单文档程序就不能初始化这个pDlg。
请问这一般错在哪里??
我也可以这样的方法建了一个DLL ,单文档程序也可以正常调用,其中DLL的创建方法是一样的,只是DLL里的对话框资源不一样 里面的成员及函数都不一样,请问我不能被初始化的那DLL问题一般在哪里??

解决方案 »

  1.   

    用同样的方法创建了很多DLL ,都可以。
    显然是我那DLL出现了问题,但不知道问题在哪里???
      

  2.   

    pDlg = pDCUdialog;
    这句是什么意思?
      

  3.   

    COPY错了 对不起 这句是我删除了一些 然后屏蔽掉的
      

  4.   

    BOOL CDCUApp::InitInstance()       //DLL入口创建
    { pDlg = new CDcuDlg;
    pDlg->Create( IDD_DCU );
    pDlg->ShowWindow( SW_HIDE );
             pDlg = pDCUdialog;
    return CWinApp::InitInstance();
    }这里用到对话框资源IDD_DCU,所以函数最前面也要加上AFX_MANAGE_STATE(AfxGetStaticModuleState());进行模块切换
      

  5.   

    扩展DLL,加AFX_MANAGE_STATE(AfxGetStaticModuleState());??
      

  6.   

    楼上正解。其实你看看VC自动生成的注释,有建议在每个函数的开始就放入AFX_MANAGE_STATE(AfxGetStaticModuleState());语句。这样做让DLL仅查找自己的资源,避免DLL读入宿主程序的资源。
      

  7.   

    为什么这样做呢?要在InitInstance中new而在ExitInstance中delete,我通常都不这样做的。
      

  8.   

    加上AFX_MANAGE_STATE(AfxGetStaticModuleState())还是一样啊 
    我试过其他DLL APP里都是按这样创建的 都可以
    但就是这个不可以,所以请大家帮忙找原因
      

  9.   

    粗心粗心,扩展DLL中应该使用
    AFX_MANAGE_STATE(AfxGetAppModuleState());
      

  10.   

    错 是动态连接MFC的Regular DLL
    不好意思
      

  11.   

    把new和Create放到你的导出函数中呢
      

  12.   

    还真不知道原因了。一般来说都是调用资源引起的。可能要跟进去看Create里边出现了什么问题。
      

  13.   

    在StdAfx.h文件中加入这样一条语句:
    #include "Resource.h"在欲编译的时候要让编译器 编译到 你的资源文件。
      

  14.   

    出现
    unhandled exception in Test.exe( NTDLL.DLL) 0XC0000005:Access Violation
      

  15.   

    楼主,watch一下窗体声明的代码,看看是不是窗体的句柄为零?
      

  16.   

    是的 hwnd = 0x000000000
      

  17.   

    在对话框中包含了activex control吗?
    如果有的话,需要包含有
    CoInitialize(NULL);
    AfxEnableControlContainer();
    如果有richeditctrl之类的控件,如果有的话,需要在动态链接库的initinstance中添加初始化函数:
    AfxInitRichEdit();
    我也遇到这样的问题,就是这样解决的.
    楼主,祝你好运了,呵呵.
      

  18.   

    http://www.somade.com/是个很专业的技术社区,去那里找找吧,或许有你要的答案~
      

  19.   

    知秋一叶) 朋友 我DIALOG里的控件有
    CButton m_btnAtRec;
    CButton m_btnHdRec;
    CButton m_LnkBtn;
    CListBox m_EvntLstBx;
    CComboBox m_linktypecombo;
    CComboBox m_portcombo;
    CButton m_addbtn;
    CButton m_cancelbtn;
    CButton m_delbtn;
    CButton m_mdfbtn;
    CIPAddressCtrl m_dcuip;
    CTreeCtrl m_ctrltree;
    CString m_usernumstr;
    CString m_portstr;
    CString m_namestr;
    其中成员中有个CSerialPort串口类请问要加什么宏?
      

  20.   

    CString m_usernumstr;
    CString m_portstr;
    CString m_namestr;
    用的是什么控件,edit?richedit?如果是后者,需要在对话框的构造函数中添加初始化函数:
    AfxInitRichEdit();
      

  21.   

    在bc 的sample例子里面,有一个dll的例子,你看一下,它的创建过程.
      

  22.   

    本人经测试,在一个单文档的菜单中调用成功,代码如下:
    class CMyDlg : public CDialog
    {
    // Construction
    public:
    CMyDlg(CWnd* pParent = NULL);   // standard constructor// Dialog Data
    //{{AFX_DATA(CMyDlg)
    enum { IDD = IDD_DIALOG1 };
    // NOTE: the ClassWizard will add data members here
    //}}AFX_DATA
    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected: // Generated message map functions
    //{{AFX_MSG(CMyDlg)
    afx_msg void OnButton1();
    afx_msg void OnClose();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };
      

  23.   

    CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CMyDlg)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    }
    void CMyDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CMyDlg)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    //{{AFX_MSG_MAP(CMyDlg)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    ON_WM_CLOSE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CMyDlg message handlersvoid CMyDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
        AfxMessageBox("dkdkdk");
    delete this;
    }
    __declspec(dllexport) void _stdcall  Show_DCUDialog()//导出函数
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMyDlg *pDlg = new CMyDlg;
    pDlg->Create(IDD_DIALOG1);
    pDlg->ShowWindow( SW_SHOW );
    }void CMyDlg::OnClose() 
    {
    // TODO: Add your message handler code here and/or call default
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CDialog::OnClose();
    delete this;
    }
      

  24.   

    在对话框关闭或点击Button1时可删除对话框自已,当然也可在点击对话框非客户区时删除自已,总之删除自已的地方多的是。
    在单文档视图中的测试代码如下:__declspec(dllimport) void _stdcall  Show_DCUDialog();void CFddView::OnEditTest() 
    {
    // TODO: Add your command handler code here
    Show_DCUDialog();
    }
      

  25.   

    是我DLL本身出问题,但现在还不知道问题在哪里 
    上次我重新写过一个DLL 也可以
    还是谢谢大家