想在DLL中做一个SDI
//派生一个窗口
class CMyWnd : public CFrameWnd
{
//。
};//DLL对外接口
CMyWnd* g_pWnd=0;
int __declspec(dllexport) ShowDialog()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
int ret=0;
g_pWnd=new CMyWnd();
if(g_pWnd)
{
ret=g_pWnd->Create("CMyWnd","123",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CRect(0,0,700,500));
if(ret!=-1)
{
g_pWnd->ShowWindow(SW_SHOW);//出错
g_pWnd->UpdateWindow();//出错
}
}
return ret;
}
//===============================================
但它总是在ShowWindow()里面报错:ASSERT(hWnd)
但看到hWnd不等于0x00000000,但它就是报错,
请问为什么它会这样(是不是使用了非用户区内存)?怎么解决?

解决方案 »

  1.   

    if(ret!=-1)
    {
    g_pWnd->ShowWindow(SW_SHOW);
    g_pWnd->UpdateWindow();
    }
    应改为
    if(!ret)
    {
    g_pWnd->ShowWindow(SW_SHOW);
    g_pWnd->UpdateWindow();
    }
      

  2.   

    CFrameWnd的Create返回值是BOOL型,TRUE为成功,FALSE失败的。
    因此应该用
    if(ret)
    {
    g_pWnd->ShowWindow(SW_SHOW);
    g_pWnd->UpdateWindow();
    }
      

  3.   

    BOOL Create("CMyWnd","123",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CRect(0,0,700,500));FLASE  0     
    TRUE   1
      

  4.   

    因为BOOL Create(...)函数调用失败,窗口句柄hWnd是一个不存在的句柄
      

  5.   

    新建一个MFC DLL (Use MFC Shared )
    //DLL对外接口
    int __declspec(dllexport) ShowDialog();/*派生一个类
    class CMyWnd:public CFrameWnd{
      //.....
    };
    */
    CMyWnd g_wnd;//记录是否已经创建Dialog,防止多次Create(...)
    bool g_bCreated=false;//接口的实现
    int ShowDialog()
    {
    if(!g_bCreated)//如果没有创建,则创建一个新的
    {
                      //注册一个    
    CString strWndClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
    this->LoadStandardCursor(IDC_ARROW),
    (HBRUSH)(COLOR_APPWORKSPACE+1),
    this->LoadStandardIcon(IDI_WINLOGO)
    );
    if(!g_wnd.Create(strWndClass,"123",WS_OVERLAPPEDWINDOW,CRect(0,0,700,600),NULL,MAKEINTRESOURCE(IDR_MAINFRAME)))
    return 0;
    g_bCreated=true;
    }
             //显示对话框
    g_wnd.ShowWindow(SW_MAXIMIZE);
    g_wnd.UpdateWindow();
    return 1;
    }现在改,可以出现对话矿了,但是关闭的时候又报错:
    这时Call Stack=
    _free_dbg_lk(void * 0x10016998, int 4) line 1044 + 48 bytes
    _free_dbg(void * 0x10016998, int 4) line 1001 + 13 bytes
    CObject::operator delete(void * 0x10016998) line 46 + 12 bytes
    CMyWnd::`scalar deleting destructor'(unsigned int 1) + 56 bytes
    CFrameWnd::PostNcDestroy() line 214 + 31 bytes
    CWnd::OnNcDestroy() line 843
    CWnd::OnWndMsg(unsigned int 130, unsigned int 0, long 0, long * 0x0012f56c) line 1825
    CWnd::WindowProc(unsigned int 130, unsigned int 0, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x10016998 {CObject}, HWND__ * 0x000e0392, unsigned int 130, unsigned int 0, long 0) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000e0392, unsigned int 130, unsigned int 0, long 0) line 368
    AfxWndProcDllStatic(HWND__ * 0x000e0392, unsigned int 130, unsigned int 0, long 0) line 57 + 21 bytes
    USER32! 77df1d0a()
    USER32! 77df2bcc()
    USER32! 77df2b84()
    NTDLL! 77fa02ff()
    CFrameWnd::OnClose() line 852
    CWnd::OnWndMsg(unsigned int 16, unsigned int 0, long 0, long * 0x0012f828) line 1825
    CWnd::WindowProc(unsigned int 16, unsigned int 0, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x10016998 {CObject}, HWND__ * 0x000e0392, unsigned int 16, unsigned int 0, long 0) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000e0392, unsigned int 16, unsigned int 0, long 0) line 368
    AfxWndProcDllStatic(HWND__ * 0x000e0392, unsigned int 16, unsigned int 0, long 0) line 57 + 21 bytes
    USER32! 77df1d0a()
    USER32! 77df2bcc()
    USER32! 77df2b84()
    NTDLL! 77fa02ff()
    USER32! 77df287f()
    USER32! 77df3d4b()
    USER32! 77df734d()
    CWnd::DefWindowProcA(unsigned int 274, unsigned int 61536, long 7536833) line 1000 + 32 bytes
    CWnd::Default() line 249
    CWnd::OnSysCommand(unsigned int 61536, unsigned int 61536) line 418 + 15 bytes
    CFrameWnd::OnSysCommand(unsigned int 61536, long 7536833) line 1046
    CWnd::OnWndMsg(unsigned int 274, unsigned int 61536, long 7536833, long * 0x0012fbd4) line 1849
    CWnd::WindowProc(unsigned int 274, unsigned int 61536, long 7536833) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x10016998 {CObject}, HWND__ * 0x000e0392, unsigned int 274, unsigned int 61536, long 7536833) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000e0392, unsigned int 274, unsigned int 61536, long 7536833) line 368
    AfxWndProcDllStatic(HWND__ * 0x000e0392, unsigned int 274, unsigned int 61536, long 7536833) line 57 + 21 bytes
    USER32! 77df1d0a()
    USER32! 77df1bc8()
    USER32! 77df72b4()
    CWnd::RunModalLoop(unsigned long 4) line 3478 + 19 bytes
    CDialog::DoModal() line 539 + 12 bytes
    CDLL_TesterApp::InitInstance() line 59 + 8 bytes
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00132c07, int 1) line 39 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00132c07, int 1) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 77e7ca90()