写了一个MFC规则动态链接库:
其中有一个函数如下:
extern "C"
_declspec(dllexport) void ShowProperty()
{      AfxMessageBox("Close");   
      CPropDialog* cpdlg=new CPropDialog(); //CPropDialog 是从Cdialog派生出来的一个类
      cpdlg->DoModal();   
     
}在测试程序中,如下调用:
void CDllDialogTestView::OnShowdialog() 
{
typedef void(*LPFNDLLFUNC1)();
HINSTANCE hDLL;              
        LPFNDLLFUNC1 lpfnDllFunc1;
hDLL=LoadLibrary("DllDialog");
if (hDLL!=NULL) {

lpfnDllFunc1=(LPFNDLLFUNC1)::GetProcAddress(hDLL,"ShowProperty");              if (lpfnDllFunc1!=NULL) {                lpfnDllFunc1();
             AfxMessageBox("Success");
}

}
else
AfxMessageBox("Fail");

}问一下:为什么我的窗口弹不出来,谢谢.  ps: AfxMessageBox("Close"); 已经执行了  

解决方案 »

  1.   

    主要是因为资源的InstanceHandle的问题。
    试试AFX_MANAGE_STATE(AfxGetModuleState())呢?
      

  2.   

    1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”
    选择“New”,至此对话框已添加到DLL工程中。3、为对话框添加一新类,如:CTest,基类为CDialog。4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数:
    extern "C" __declspec(dllexport) void Show() 

     AFX_MANAGE_STATE(AfxGetStaticModuleState());
     CTest test; test.DoModal (); 

    别忘了在文件中添加: #include "Test.h"; 5、用VC新建一对话框工程,在一按钮点击事件中添加如下代码:
     typedef void (WINAPI * TESTDLL)();
     HINSTANCE hmod; hmod = ::LoadLibrary ("mfcdll.dll");
     if(hmod==NULL)
     { 
    AfxMessageBox("Fail");
     } 
    TESTDLL lpproc; 
    lpproc = (TESTDLL)GetProcAddress (hmod,"Show"); 
    if(lpproc!=(TESTDLL)NULL) (*lpproc)(); 
    FreeLibrary(hmod);  
    6、试试看,是不是DLL中对话框显示出来了....
      

  3.   

    http://www.vckbase.com/document/viewdoc/?id=543
      

  4.   

    应为对话框要根据对话框资源创建,而你的对话框的资源在Dll中,所以在Dll中显示对话框时用
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    在将当前的资源句柄设置为Dll模块,这样就可以显示了。如果不想在dll中设置。就像你最的代码,那么在调用时设置也可以。对你原程序修改如下extern "C"
    _declspec(dllexport) void ShowProperty()
    {
    AfxMessageBox("Close");
    CPropDialog* cpdlg=new CPropDialog(); //CPropDialog 是从Cdialog派生出来的一个类
    cpdlg->DoModal();
    }在测试程序中,如下调用:
    void CDllDialogTestView::OnShowdialog()
    {
    typedef void(*LPFNDLLFUNC1)();
    HINSTANCE hDLL;
    LPFNDLLFUNC1 lpfnDllFunc1;
    hDLL=LoadLibrary("DllDialog"); HANDLE hRes = AfxGetResourceHandle();
    AfxSetResourceHandle(hDLL);
    if (hDLL!=NULL) {
    lpfnDllFunc1=(LPFNDLLFUNC1)::GetProcAddress(hDLL,"ShowProperty"); if (lpfnDllFunc1!=NULL) { lpfnDllFunc1();
    AfxMessageBox("Success");
    }
    }
    else
    AfxMessageBox("Fail"); AfxSetResourceHandle(hRes);
    }
      

  5.   

    看了MSDN 基本了解这个宏的作用 谢谢各位的解答