阅读:2539回复:23
VC 的问题大家帮忙看看
用 AppWizard 生成单文档模版项目,用 DevParter 启动 Error Detection 追踪,总在 MainFrame.cpp 中的状态栏、工具栏生成代码中提示出错,
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0(\"Failed to create toolbar\\n\"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0(\"Failed to create status bar\\n\"); return -1; // fail to create } // TODO: Delete these three lines if you don\'t want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; } 如果在98下运行,表现的不良现象是第一次运行时,把鼠标移到工具栏上,等 tooltip 出来后移开,关闭程序。然后再次启动程序,再把鼠标移到工具栏上去,over,程序崩溃,有谁知道是怎么回事吗? 全部用 Mfc Appwizard 生成的代码,没有添加任何代码也是这样。 :( |
|
|
沙发#
发布于:2004-06-01 19:21
DevParter 提示的错误如下:
Argument 2 in ReleaseDC (HDC__ hdc = 0xCD010D3C) still contains non default/stock objects. ********************************************************* 对应的代码在:Wingdi.cpp CClientDC::~CClientDC() { ASSERT(m_hDC != NULL); ::ReleaseDC(m_hWnd, Detach()); } ReleaseDC() 出错了 ********************************************************** 而导致该 dc 释放的原因是状态栏的 SetIndicators() 使用了一个局部变量 dcScreen. BOOL CStatusBar::SetIndicators(const UINT* lpIDArray, int nIDCount) { ASSERT_VALID(this); ASSERT(nIDCount >= 1); // must be at least one of them ASSERT(lpIDArray == NULL || AfxIsValidAddress(lpIDArray, sizeof(UINT) * nIDCount, FALSE)); ASSERT(::IsWindow(m_hWnd)); // first allocate array for panes and copy initial data if (!AllocElements(nIDCount, sizeof(AFX_STATUSPANE))) return FALSE; ASSERT(nIDCount == m_nCount); // copy initial data from indicator array BOOL bResult = TRUE; if (lpIDArray != NULL) { HFONT hFont = (HFONT)SendMessage(WM_GETFONT); CClientDC dcScreen(NULL); HGDIOBJ hOldFont = NULL; if (hFont != NULL) hOldFont = dcScreen.SelectObject(hFont); AFX_STATUSPANE* pSBP = _GetPanePtr(0); for (int i = 0; i < nIDCount; i++) { pSBP->nID = *lpIDArray++; pSBP->nFlags |= SBPF_UPDATE; if (pSBP->nID != 0) { if (!pSBP->strText.LoadString(pSBP->nID)) { TRACE1(\"Warning: failed to load indicator string 0x%04X.\\n\", pSBP->nID); bResult = FALSE; break; } pSBP->cxText = dcScreen.GetTextExtent(pSBP->strText).cx; ASSERT(pSBP->cxText >= 0); if (!SetPaneText(i, pSBP->strText, FALSE)) { bResult = FALSE; break; } } else { // no indicator (must access via index) // default to 1/4 the screen width (first pane is stretchy) pSBP->cxText = ::GetSystemMetrics(SM_CXSCREEN)/4; if (i == 0) pSBP->nStyle |= (SBPS_STRETCH | SBPS_NOBORDERS); } ++pSBP; } if (hOldFont != NULL) dcScreen.SelectObject(hOldFont); } UpdateAllPanes(TRUE, TRUE); return bResult; } |
|
|
板凳#
发布于:2004-06-01 20:11
你最好把整个工程文件都传上来,才好帮你调.
|
|
|
地板#
发布于:2004-06-01 23:42
只要有 vc ,直接用 appwizard 生成一个单文档项目就可以了。
|
|
|
地下室#
发布于:2004-06-01 23:44
不过在 w2k 下运行程序不会出错;用 DevParter 查才会提示有错误。 但在 98 下就会出现问题了。不知道是什么原因。
|
|
|
5楼#
发布于:2004-06-02 09:34
我发现对VC还是没有入门。Devparter是什么?
|
|
|
6楼#
发布于:2004-06-02 11:02
晕,vc 高手难道没有来灌水的吗
把 CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 中ToolBar 相关的代码注释就没有错误了。但到底是什么原因呢?怎么解决呢? TooBar 里装载了位图资源,到了 StatusBar 的时候就提示上述错误了。好像是 StatusBar 中的局部变量 CClientDC dcScreen(NULL); 与 ToolBar 装载的 DC 是同一个 DC,可是我怎么知道这两个 DC 倒是是不是同一个 DC 呢? 如果是同一个,有什么方法可以解决呢? |
|
|
7楼#
发布于:2004-06-02 14:32
有些资源泄漏不用管,象Devpanter或者BoundsChecker都有一些是误报的
还有一些是MFC本身的问题,就算查出来有泄漏也没办法修正,不过这些一般都没什么大碍的 主要的是自己的代码有没有内存泄漏 :P |
|
|
8楼#
发布于:2004-06-03 08:48
这个我也发现了,每次用 DevParter ,BoundsChecker都是一大堆资源泄漏,但程序运行并无问题。
主要是这次有点奇怪,在 98 下老遇到这个问题(上面所述),把鼠标移到工具栏上程序就崩溃了,所以想彻底查一下。 关键是用 VC AppWizard 直接生成的单文档模版应用程序,不做任何修改,也存在上述问题。先运行,把鼠标移到工具栏上,等出现 tooltip 后移开,关闭程序。然后再次运行,再把鼠标移到工具栏上就死了。 用 DevParter ,BoundsChecker 看的话正好提示工具栏那段代码是产生错误的原因。所以我想还是有原因的。 现在不清楚到底是98的问题,还是 vc 的问题。我想这种想象应该不止我一个人遇到过,所以想问一下。 :( |
|
|
9楼#
发布于:2004-06-04 15:05
5555555555555555555555555
玩 vc 的难道没有潜水的吗? |
|
|
10楼#
发布于:2004-06-04 15:09
晕
怎么贴图? [编辑 - 6/4/04 by lvwj] |
|
|
11楼#
发布于:2004-06-04 23:39
哎
看来真地很少人遇见这种问题 :( |
|
|
12楼#
发布于:2004-06-05 13:28
装VC的SP6看看?
|
|
13楼#
发布于:2004-06-05 14:16
今天刚下下来装上,好像不起作用,真是晕倒
|
|
|
14楼#
发布于:2004-06-05 14:18
呵呵,这几天一直在看书找相关资料,还没有找到 :(
不知道设备上下文使用时的具体限制条件是什么,为什么微软提供的 ToolBar 不按自己的规矩设计,而让 Devparter 不停的报错。 |
|
|
15楼#
发布于:2004-06-06 22:48
用vs.net2003会不会有同样的问题呢?现在很少用VC6了,它的IDE好几次无故把源文件弄丢了。devpartner好长时间没用了,不知道现在的版本好不好使。现在我一般用purify plus 测内存泄漏,程序性能。
[编辑 - 6/6/04 by zweiwan] |
|
16楼#
发布于:2004-06-07 13:03
我发现对VC还是没有入门。Devparter是什么? |
|
17楼#
发布于:2004-06-07 16:18
Devparter是什么 软件除错、性能分析工具。 看看论坛主页上郎维公司销售的软件说明。 |
|
|
18楼#
发布于:2004-06-08 09:03
用vs.net2003会不会有同样的问题呢?现在很少用VC6了,它的IDE好几次无故把源文件弄丢了。devpartner好长时间没用了,不知道现在的版本好不好使。现在我一般用purify plus 测内存泄漏,程序性能。 你是不是装了诺顿?其实应该不是VC的IDE的问题,装了诺顿有时会把源文件弄丢,尤其是当你按CTRL+S保存的时候 有一次保存后编译不通了,怎么也找不到问题,后来仔细一看原来是把两个文件给拼到一个文件中了,一个保留了前半部分,一个保留了后半部分!:mad: :mad: 不过已经很久不用诺顿了 :P |
|
|
19楼#
发布于:2004-06-08 11:58
[quote]用vs.net2003会不会有同样的问题呢?现在很少用VC6了,它的IDE好几次无故把源文件弄丢了。devpartner好长时间没用了,不知道现在的版本好不好使。现在我一般用purify plus 测内存泄漏,程序性能。 你是不是装了诺顿?其实应该不是VC的IDE的问题,装了诺顿有时会把源文件弄丢,尤其是当你按CTRL+S保存的时候 有一次保存后编译不通了,怎么也找不到问题,后来仔细一看原来是把两个文件给拼到一个文件中了,一个保留了前半部分,一个保留了后半部分!:mad: :mad: 不过已经很久不用诺顿了 :P [/quote] VC6的bug,SP6改了 |
|
上一页
下一页