【问题标题】:WTL and CContainedWindow causing access violationWTL 和 CContainedWindow 导致访问冲突
【发布时间】:2012-05-24 11:39:13
【问题描述】:

我正在尝试使用此代码对对话框中的进度控件进行子类化:

ATL::CContainedWindowT<WTL::CProgressBarCtrl> progress;
// ...
progress.SubclassWindow(GetDlgItem(IDC_PROGRESS));

那里一切都好。现在,如果我尝试这样做:

progress.SetRange(0, 100);

在一个简单的 WTL 的 SetRange() 实现中,我在 SendMessage 上遇到访问冲突异常。我一直在上下搜索,我所能找到的只是这可能是Applications Using Older ATL Components May Experience Conflicts With DEP 中提到的一些“thunking”问题,它不应该真正适用于我,因为我使用的是最新的 ATL 和 WTL(Visual Studio 2010 和 @987654322 @)。即使我使用 WTL 8.0,我也会遇到同样的问题。

由于 HWND 有效,子类化已完成。有什么想法吗?

【问题讨论】:

    标签: c++ atl wtl


    【解决方案1】:

    WTL::CProgressBarCtrl m_Progress;

    【讨论】:

    • CProgressBarCtrl 没有实现 SubclassWindow 所以这不是要走的路。你能说得更具体点吗?
    • m_Progress.Attach(GetDlgItem(IDC_PROGRESS1)); m_Progress.SetPos(0);
    【解决方案2】:

    如果您子类化一个窗口,那么您应该为这个子类化控件实现一个消息映射。这包括将您的成员变量连接到构造函数中的消息映射,将ALT_MSG_MAP 添加到类消息映射。你在做这个吗?我想你没有。

    您首先需要这个吗?要只发送不需要子类化的消息,您只需要将真实的HWND 附加到CProgressBarCtrl 实例:

    WTL::CProgressBarCtrl m_ProgressBar;
    // ...
    m_ProgressBar = GetDlgItem(IDC_PROGRESS);
    m_ProgressBar.SetRange(...
    

    由于 HWND 有效,子类化已完成

    不,这不好。你钩住了窗口,但你没有提供你的 WindowProc。因此,问题。

    【讨论】:

    • 谢谢。来自Code Project 的文章误导我相信我应该使用CContainedWindow。这篇文章确实使用了ALT_MSG_MAP,但并不明显这是强制性的,“访问冲突”当然是一个惊喜。尽管您的回答要详细得多,但我还是奖励 @johnathon 是第一个。
    • 顺便说一句,这篇文章确实在“ATL 方式 2”部分 codeproject.com/Articles/4028/… 中展示了 CContainedWindow 的正确用法
    • 是的,我现在可以看到,但简单的m_ProgressBar = GetDlgItem(IDC_PROGRESS) 方法并不明显。谢谢!
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2016-06-15
    • 2018-12-07
    相关资源
    最近更新 更多