我首先建立了一个以对话框为基础的应用程序,我需要根据要求调用DLL中的对话框,但我希望在DLL中的对话框为非模式对话框,然后动态调用DLL
如下:
extern "C" __declspec( dllexport ) void MyDllTest()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CDllDlg *dlg = new CDllDlg;
    dlg->Create(IDD_DLG);
    dlg->ShowWindow(SW_SHOW);
}然后动态调用DLL,程序运行出错
后来我在主程序中添加一个CWinThread线程类然后在线程中启动DLL,而这时候我在DLL中如下作:
BEGIN_MESSAGE_MAP(CMchdllApp, CWinApp)
END_MESSAGE_MAP()
// CMchdllApp 构造CMchdllApp::CMchdllApp()
{
    // TODO: 在此处添加构造代码,
    // 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CMchdllApp 对象CMchdllApp theApp;
// CMchdllApp 初始化BOOL CMchdllApp::InitInstance()
{
    CWinApp::InitInstance();
    CDllDlg dlg;
    dlg.DoModal();    return TRUE;
}extern "C" __declspec( dllexport ) HWND MyDllTest()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return(theApp.m_pMainWnd->GetSafeHwnd());
    
}
这样作,相当于另外启动一个程序吧?但是两个对话框切换时仍然有些不正常的现象
请问高手们,有没有更好的方法在DLL中显示对话框,而且可以同时操作主程序对话框和DLL对话框,并且两个对话框之间可以通讯.
如果我这种方法也可以成功的话请问,我缺少了什么东西,我该注意什么?

解决方案 »

  1.   

    need parent hwnd handle
      

  2.   

    主要是消息循环的处理,你看一下MSDN具体的我也不记得了!
      

  3.   

    extern "C" __declspec( dllexport ) void MyDllTest()
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        CDllDlg *dlg = new CDllDlg;
        dlg->Create(CDllDlg::IDD); ////改一下这里
        dlg->ShowWindow(SW_SHOW);
    }
      

  4.   

    hanbig
    我已经没有什么相关代码了,只不过是随手建立个工程,都是MFC代码,我差不多把我所有手动的代码都贴了,呵呵
    谢谢konista,等我试试。
      

  5.   

    konista,我已经试过,不行的。
      

  6.   

    extern "C" __declspec( dllexport ) void MyDllTest()
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        CDllDlg *dlg = new CDllDlg;
        dlg->Create(IDD_DIALOG,NULL);
        dlg->ShowWindow(SW_SHOW);
    }
      

  7.   

    mynamelj(风之羽翼) 
    已经试过,不行的
      

  8.   

    问题仍然无法解决,但我感谢各位的热心帮助。
    我的做法是这样的,
    extern "C" __declspec( dllexport ) void MyDllTest()
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        CDllDlg dlg;
        dlg.DoModal();
    }
    做成模式对话框。
    然后在主程序中建立一个线程,在线程中动态调用DLL,这时候就可以同时显示两个窗口了。
    但我是个菜鸟,不知道这样的两个窗口如何通讯 呵呵,大家继续指教。
      

  9.   

    konista(M):
    能否把你试验的工程发给我对比? 我的文件实在也没什么东西了。
    [email protected]
      

  10.   

    我也在DLL中SHOW出非模式窗口,但并不是在引出函数中作到的。只是在引出函数中安装一个HOOK,在第一次响应HOOK的时候new窗体,然后create,在以后响应HOOK的时候显示出来。窗体指针是全局变量
      

  11.   

    hanbig:
        在程序中,如果没有DLL,这样作很简单,但有了DLL,似乎麻烦很多
        您能否发给我个例子给我,我的油箱 [email protected], 最好再示范一下怎么通讯 呵呵,谢谢了
      

  12.   

    我估计有可能是资源句柄出了问题,就是说这个Create函数无法找到你的对话框资源模板
      

  13.   

    CDllDlg *dlg = new CDllDlg;
        dlg->Create(IDD_DLG);
        dlg->ShowWindow(SW_SHOW);
    ===========================
    CDllDlg *dlg = new CDllDlg;
        dlg->Create(IDD_DLG,this);
        dlg->ShowWindow(SW_SHOW);
      

  14.   

    你的动态输出DLL是没有写错的,应该是你调用的时候出错了,
    我写了一份运行正确,不知道你要不要
    .cn
      

  15.   

    linxy2002(阿郎) 
    能否把运行正确的发给我?
      

  16.   

    感谢各位的帮助,我跟阿郎给我的文件对比一下,发现一个愚蠢的错误,就是随后用了freelibry
    另外hanbig konista说的对,这是调用的问题, 不要嫌分数少, 谢谢