在一个regual的dll工程中添加了一个对话框的类
这个dll的导出函数如下:extern "C" __declspec(dllexport) int Show()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CVerison *ver = new CVerison; //CVerison是自己在dll工程中加的类
ver->Create(IDD_DIALOG1,NULL); ver->ShowWindow(SW_SHOW);
return 1;
}现在是在别的工程中加载这个dll后调用show函数时,不能显示对话框并导致程序的关闭。

解决方案 »

  1.   

    是资源设置的问题。
    用AfxSetResourceHandle:
    ======================================
    AfxSetResourceHandle
    This function sets the HINSTANCE handle that determines where the default resources of the application are loaded.void AfxSetResourceHandle(
    HINSTANCE hInstResource ); 
    Parameters
    hInstResource 
    Specifies the instance or module handle to an .EXE or DLL file from which the application’s resources are loaded. ==============================================
    如果不做设置,程序会试图在exe中搜索资源,而不是在dll中搜索资源。
    显示完对话框,在将资源句柄设回原址
      

  2.   

    extern "C" __declspec(dllexport) int Show(HWND hMainWnd)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());CVerison *ver = new CVerison(CWnd::FromHandle(hMainWnd)); //CVerison是自己在dll工程中加的类
    ver->Create(IDD_DIALOG1,NULL);ver->ShowWindow(SW_SHOW);
    return 1;
    }
      

  3.   

    to :syy64照你的方法可以通过调试,但是一运行就崩溃了 啊??我是这样调用的,有问题吗??void CTtDlg::OnOK() 
    {
    // TODO: Add extra validation here
    typedef int(*Co)(HWND hwnd);
        HINSTANCE hinstDLL=NULL; 
    hinstDLL=LoadLibrary("VersionCtrl.dll");
    if(hinstDLL)
    {
    Co p;
    p=(Co)GetProcAddress(hinstDLL,"ShowDlg");
    p(AfxGetApp()->m_pMainWnd->m_hWnd);
    DWORD err = ::GetLastError();
    if   (::GetLastError()   ==   NO_ERROR)  
     ::SetLastError(err);   
    }
    else
    MessageBox("系统需要调用的DLL 文件不存在!");
    if(hinstDLL)
    FreeLibrary(hinstDLL);
    // CDialog::OnOK();
    }
    多谢帮帮忙啊!!
      

  4.   

    extern "C" __declspec(dllexport) int Show(HWND hMainWnd)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());CVerison *ver = new CVerison; //CVerison是自己在dll工程中加的类
    ver->Create(IDD_DIALOG1,CWnd::FromHandle(hMainWnd));ver->ShowWindow(SW_SHOW);
    return 1;
    }
      

  5.   

    还有一个奇快的问题是,如果
    extern "C" __declspec(dllexport) int Show(HWND hMainWnd)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());CVerison ver;
    ver.domodal();
    return 1;
    }
    这样是没问题的,但是如果跟踪一下的话会发现ver的指针为空,居然也能够条用domoal函数???如果在上面那个函数中加上这么一句ver.m_Email.SetWindowText(email);//m_Email为类的一个button马上就会有一个断言错误说ver的指针是空的。真是好奇怪啊!!那位大牛给解释一下撒啊!
      

  6.   

    你有没有在对话框中应用RichEdit控件?
    如果有的话你试试在InitInstance()函数中加入这一句代码
    AfxInitRichEdit();
    我以前也碰到过
      

  7.   

    p=(Co)GetProcAddress(hinstDLL,"ShowDlg");
    p(AfxGetApp()->m_pMainWnd->m_hWnd);
    -------------------------------------------------------
    你这两行有问题:
    1.你dll导出的函数名是"show",而你要找的函数却是"showdlg"
    2.使用p之前要判断p是否为空还有你连CDialog::OnOK()都注释掉了,即使你的那个什么对话框显示出来,你的主程序也无法退出