• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 看jiangsheng大哥的代码---顺便帮忙解释一下,atl多线程的问题

看jiangsheng大哥的代码---顺便帮忙解释一下,atl多线程的问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了atl是哪个机场代码,atl三字代码,atl机场三字代码,atl股票代码,atl代码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 看jiangsheng大哥的代码---顺便帮忙解释一下, atl多线程的问题
描述:

MFC提供了许多十分有用的类和对象,在很多时候在Office插件、BHO、常规DLL这样的工程中加入MFC支持是一个不错的选择。但是,MFC中的很多功能,例如资源查找,消息预处理等等都依赖于在进程或者线程创建时被初始化的MFC内部数据;而对于需要添加MFC支持的工程,这些数据并不会被自动地初始化。这时候使用一些MFC的功能,例如使用CString从字符串表加载一个字符串,或者使用CDialog::DoModal()创建一个模态对话框,都会有断言错误,用ATL向导创建的支持MFC的程序也没有多少改善,在CWinApp的DLL版本中没有初始化线程数据,所以调用AfxGetThread会返回空指针。解决这个问题的一个办法是使用AfxBeginThread来启动一个MFC线程,这样MFC会初始化线程相关的数据。在下面的示例中,我在线程初始化时建立了一个模态对话框,以避免直接创建模态对话框会触发的断言失败信息。为了模拟模态对话框的效果,在CDialogThread::WaitForDoModal()这个函数中创建了一个消息循环来等待线程结束,同时用MsgWaitForMultipleObjects来避免死锁。因为MFC中和进程相关的数据并不总是被正确初始化,在调用模态对话框之前也需要手动设置一下。 
//如果这段代码可以工作,那么它的作者是Jiangsheng
//否则我不知道它的作者
void __stdcall CFrontPageAddin::OnClickButtonExportCHM(IDispatch* /*Office::_CommandBarButton* 
*/ Ctrl,VARIANT_BOOL * CancelDefault)
{
    AtlTrace(_T(" CFPAnt::OnClickButtonExportCHM\n"));
    //create a thread to avoid assert failure
    CDialogThread* pDialogThread=
        (CDialogThread*)AfxBeginThread(RUNTIME_CLASS(CDialogThread),
        THREAD_PRIORITY_NORMAL,
        0,
        CREATE_SUSPENDED,NULL);
    if(pDialogThread)
    {
        pDialogThread->m_prc=RUNTIME_CLASS(CExportCHMSheet);
        pDialogThread->ResumeThread();
        pDialogThread->WaitForDoModal();
        delete pDialogThread;
    }
}
class CDialogThread : public CWinThread
{
    ......
    int m_nModalResult;
    CRuntimeClass* m_prc;
    void WaitForDoModal();
    ......
};
CDialogThread::CDialogThread()
{
    m_bAutoDelete=FALSE;
    m_prc=NULL;
    m_nModalResult=0;
}
BOOL CDialogThread::InitInstance()
{
    // TODO: perform and per-thread initialization here
    AFX_MANAGE_STATE(AfxGetAppModuleState());
    AFX_MODULE_STATE* pModuleState=AfxGetModuleState();
    pModuleState->m_hCurrentInstanceHandle=_Module.GetModuleInstance();
    AfxSetResourceHandle(_Module.GetModuleInstance());
    if(m_prc)
    {
        if(m_prc->IsDerivedFrom(RUNTIME_CLASS(CDialog)))
        {
            CDialog* pDialog=(CDialog*)m_prc->CreateObject();
            if(pDialog)
            {
                m_pMainWnd=pDialog;
                m_nModalResult=pDialog->DoModal();
            }
        }
        else if(m_prc->IsDerivedFrom(RUNTIME_CLASS(CPropertySheet)))
        {
            CPropertySheet* pDialog=(CPropertySheet*)m_prc->CreateObject();
            if(pDialog)
            {
                m_pMainWnd=pDialog;
                m_nModalResult=pDialog->DoModal();
            }
        }
    }
    return FALSE;
}
void CDialogThread::WaitForDoModal()
{
    //from http://blogs.msdn.com/oldnewthing/archive/2005/02/17/375307.aspx
    MSG msg;
    UINT cRecords = 0;
    while (true) {
        switch (MsgWaitForMultipleObjects(1, &m_hThread,
            FALSE, INFINITE, QS_ALLINPUT)) {
            case WAIT_OBJECT_0:
            return ; // event has been signalled
            break;
            case WAIT_OBJECT_0+1:
            // we have a message - peek and dispatch it
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            break;
            default:
            return ; // unexpected failure
        }
    }
}
使用VC6.0编译通过。
上面的方法只对于DLL之类的组件比较有用。对于使用MFC的应用程序来说,上面的方法比较繁琐。比较简单的方法还是使用MFC向导来创建应用程序,然后再添加ATL或者.Net之类的额外支持。参考微软知识库文章Q181505和Q824480。
问题:
1, pDialogThread->m_prc=RUNTIME_CLASS(CExportCHMSheet); 中的CExportCHMSheet是什么意思?
2, InitInstance 和 WaitForDoModal分别做了什么?
请大侠赐教.


解决方案1:

you need to set up 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ATL向导生成的代码太讨厌了
  • ATL怎么做一个普通的窗口,谁能给个源代码看看??
  • 请教ATL中的一段代码有什么含义
  • 问一个ATL库的代码
  • 对一句ATL代码的疑问
  • 请问这是一个ATL么?
  • 累了,求关于ATL编辑框的代码
  • 在MFC中可以正常使用的代码,到ATL中就无法使用了,请指教。。。。。
  • 大侠指导下,怎么用ATL写个爬虫的代码
  • ATL是c++模板库?为什么比MFC的com编程效率高呢?

相关文章

  • 2017-06-05 求一个多进程间产生死锁的例子,给出源代码的50分!!
  • 2017-06-04 Activex中如何改变属性页的语言
  • 2017-06-05 求助:msdn中没有ShockwaveFlashObject文档
  • 2017-06-05 如何把bin文件做成可执行文件?
  • 2017-06-05 一个有关键盘钩子的问题,请教会此技术的朋友
  • 2017-06-04 MFCATL关于导出到word的代码不理解。请高手帮忙!!
  • 2017-06-05 A进程CreateProcess了B进程,A怎么知道B已经退出了?
  • 2017-06-05 杀掉挂起的进程,如果把错误提示窗口(比如内存0Xxxxx不可write之类的窗口)也关闭?
  • 2017-06-04 急啊!!!高手来救救我啊!!!
  • 2017-06-05 help!!!如何使用spawn啊?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 我不学MFC,直接ATL可以么
    • 怎样使用多线程的串口控件
    • 服务中使用定时器?
    • 求助getwindowrect和getclientrect
    • idl,odl文件定义和包含,在线等
    • activeserverpage错误
    • 如何反编译VC++60写的DLL
    • 有关显示GIF图的ActiveX控件
    • 如何在dll中取得CWinApp对象
    • 向各位高手请教:如何捕获MS_Word中文本输入的位置及内容?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有