想在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,但它就是报错,
请问为什么它会这样(是不是使用了非用户区内存)?怎么解决?
//派生一个窗口
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,但它就是报错,
请问为什么它会这样(是不是使用了非用户区内存)?怎么解决?
解决方案 »
- vc2010选项卡
- CInternetSession获取网页数据有时会只返回部分数据并没有异常?
- 有事件正在进行,怎样让同样操作的点击无效?
- 服务程序的奇怪问题
- 建一个CComboBox的子类,想重载其选择事件,该怎么办?大侠请看看我的方法哪里错了?
- 急!!!大虾救命,如能解决万分感激!高分相送
- 如何让窗口响应WM_LBUTTONDBCLK?鼠标双击发出的是WM_LBUTTONDOWN消息
- 求救:在任务栏上作了一个图标,点击的弹出菜单........
- 我要上QQ!!!我要上中国游戏中心!!!各位大虾快来帮我
- 问一下,我做串口通讯用类CMSCOMM和CreateFile()、WriteFile、ReadFile有什么区别?
- SplitterWnd的分割窗口中一般都是绑定CView类,有办法绑定CDialog类吗?
- ATL生成的COM如何转换成COM+?请指点
{
g_pWnd->ShowWindow(SW_SHOW);
g_pWnd->UpdateWindow();
}
应改为
if(!ret)
{
g_pWnd->ShowWindow(SW_SHOW);
g_pWnd->UpdateWindow();
}
因此应该用
if(ret)
{
g_pWnd->ShowWindow(SW_SHOW);
g_pWnd->UpdateWindow();
}
TRUE 1
//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()