如题。
dll:
void CCurveLinePlot::ShowDialog()
{
AFX_MANAGE_STATE(AfxGetAppModuleState());
CDialog dlg(IDD_ABOUTBOX);//(IDD_DIA_DIALOG); IDD_DLG_ABOUT
dlg.DoModal();
}
类:
class AFX_EXT_CLASS CCurveLinePlot : public CButton
{
        static void ShowDialog();
}
注册dll:
BOOL CCurveLinePlot::RegisterWndClass(HINSTANCE hInstance)
{
WNDCLASS wc;
//initialize the winddow class;
memset(&wc, 0, sizeof(wc)); 
wc.lpszClassName ="CCurLinePlot";// 这一句的类名是用在客户程序中的
wc.hInstance = hInstance;
wc.lpfnWndProc=CurLineWndProc; //::DefWindowProc;//这一步到底应该用什么?
wc.hCursor = ::LoadCursor(NULL,IDC_ARROW); //设置鼠标的形状为系统常见的形状
wc.hIcon = 0; 
wc.lpszMenuName = NULL; 
wc.hbrBackground = (HBRUSH)::GetStockObject(LTGRAY_BRUSH); //设置系统画刷
wc.style  = CS_GLOBALCLASS; //这一句是什么意思我至今也没搞懂 ,是照书抄的 
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
return AfxRegisterClass(&wc);
}大侠帮忙啊。查了几天了,没有答案。

解决方案 »

  1.   

    MFC扩展DLL不需要AFX_MANAGE_STATE(AfxGetAppModuleState());
    用CDialog不需要注册类。
      

  2.   

    CDialog不需要注册类,怎么理解?不作为类的成员函数?类本身是导出类,能不能详细点?谢谢。在线等。
      

  3.   

    我的意思是使用CDialog不需要AfxRegisterClass,CDialog内部会自己注册类。
      

  4.   

    我已经把AFX_MANAGE_STATE(AfxGetAppModuleState()); 
    删除了,还能使,谢谢。
    现在主要问题有两个:上面红色为一个。另一个就是在外部测试的时候怎么总显示测试资源里面的对话框
      

  5.   

    你好。我的主要目的是生成dll,以后就可以使用了。而这个dll使用扩展dll,里面有对话框资源,id=xxxx,测试端要调用dll里面的对话框资源,测试端也有对话框资源,id=xxxx,结果dll中被屏蔽,如果两个id不同,则忽略dll中id的对话框资源。
      

  6.   

    你好。我的主要目的是生成dll,以后就可以使用了。而这个dll使用扩展dll,里面有对话框资源,id=xxxx,测试端要调用dll里面的对话框资源,测试端也有对话框资源,id=xxxx,结果dll中被屏蔽,如果两个id不同,则忽略dll中id的对话框资源。
      

  7.   

    wc.lpfnWndProc应该给一个你自己定义的窗口函数,不过我看不出你的CCurveLinePlot::RegisterWndClass函数有什么作用,ShowDialog与这个函数一点关系也没有。
      

  8.   

    CCurveLinePlot::RegisterWndClass的目的是注册dll。
    单作一个程序测试dll的时候怎么总显示测试资源里面的对话框,同id的dll内部的被屏蔽总是显不出来?这就是主要的目的。这里列出的代码都是dll内部的。我查了一下,注册dll应该这样写啊,我没查对? 
    dll中定义了一个类,要导出,class AFX_EXT_CLASS CCurveLinePlot : public CButton ,然后该类有一个成员函数: ShowDialog()。在 ShowDialog()函数中调用dll的资源,即IDD_ABOUTBOX的一个对话框资源。 
    测试dll的对话框程序里也有IDD_ABOUTBOX这样的一个对话框资源,此时,运行测试程序,显示出来的却是测试程序中的对话框资源,而同名的dll中的对话框资源被屏蔽。如果把dll中的这个ID改为别的不重复的ID号,则连dll的对话框或者测试程序中的对话框资源都不会显示。这是为什么?
      

  9.   

    AfxRegisterClass是注册WndClass的,就是定义窗口或控件类型的。MFC扩展DLL不需要注册,只有组件才需要注册,而且注册也不是用这样的方法。这段代码是否执行都不会有影响。
    对话框资源的问题,你可以试试在ShowDialog函数中用AfxSetResourceHandle将默认资源模块设置为DLL的句柄,函数返回时再设置为EXE的句柄。
      

  10.   

    *****************************************************
    .cpp
    *****************************************************
    ......................
    #include "CurveLinePlot.h"
    ..............
    extern "C" __declspec(dllexport) void ShowDialog();
    LRESULT CALLBACK AFX_EXPORT CurLineWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    static AFX_EXTENSION_MODULE CurveLinePlotDLL = { NULL, NULL };
    extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    .......................
    }
    /////////////////////////////////////////////////////////////////////////////
    // CCurveLinePlotCCurveLinePlot::CCurveLinePlot()
    {
    ......................
    }CCurveLinePlot::~CCurveLinePlot()
    {
    ...........................
    }
    /////////////////////////////////////////////////////////////////////////////
    // CCurveLinePlot message handlersextern "C" __declspec(dllexport) void ShowDialog()
    {
    CDialog dlg(IDD_ABOUTBOX);
    dlg.DoModal();
    }
    *****************************************************
    .h
    *****************************************************
    ...........
    #include "resource.h"//LRESULT CALLBACK AFX_EXPORT CurLineWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    class AFX_EXT_CLASS CCurveLinePlot : public CButton
    {.......................
    };
    /////////////////////////////////////////////////////////////////////////////********************************************************************
    测试dll
    *(*****************************************************************
    .................
    extern "C" __declspec(dllimport) void ShowDialog();...............
    void CDddDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    HINSTANCE exe_hInstance = GetModuleHandle(NULL);
    HINSTANCE dll_hInstance  = GetModuleHandle("CurveLinePlot.dll");//AfxGetResourceHandle();
    AfxSetResourceHandle(dll_hInstance );
    //CCurveLinePlot::ShowDialog();
    AfxMessageBox("before DLL");
        ShowDialog();// 依然有问题
    AfxMessageBox("after DLL");

    AfxSetResourceHandle(exe_hInstance); 
    AfxMessageBox("EXE");
    ShowDialog();
    AfxMessageBox("EXE");
    }
    为什么还是不行?
      

  11.   

    上面的问题已经初步解决。实现了两种方法。但是还有一种方法就是
    http://hi.baidu.com/ming111/blog/item/484e9b13dff1e5d5f6039e1b.html
    里面介绍的第三种方法,这种方法里面的ShowDlg(); 函数的调用问题,我头疼了一天了。
    请帮忙。谢谢。