none
VS2008中绑定变量的问题 RRS feed

  • 问题

  • 环境VS2008,unicode。
    绑定控件变量
    在程序的对话框中绑定控件变量正确使用,但在DLL的对话框中相同方法绑定控件变量编译可以通过,执行错误。
    我把一个列表框绑定变量m_list,然后使用以下代码即可。
    void Ctest8Dlg::OnBnClickedButton1()
    
    {
    
     // TODO: 在此添加控件通知处理程序代码
    
     m_list.AddString(_T("北京"));
    
    }
    但是我在DLL的对话框中相同的方法使用编译没有问题,程序执行错误。请问是什么原因?
    2010年5月19日 7:31

答案

  • 调试窗口也有输出信息的。

    不过你上面的代码即使不是DLL也会出错,因为没有调用基类的实现,所以m_testcombo没有通过DDX子类化对话框上的窗口。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月19日 18:27
    版主

全部回复

  • DLL需要切换资源,由于DLL有着自己的资源信息。所以主进程中在调用DLL的方法需要在调用之前切换资源。

    在调用DLL函数中添加

    AFX_MANAGE_STATE(AfxGetStaticModuleState());


    麻烦把正确答案设为解答。
    2010年5月19日 9:34
    版主
  • DLL需要切换资源,由于DLL有着自己的资源信息。所以主进程中在调用DLL的方法需要在调用之前切换资源。

    在调用DLL函数中添加

    AFX_MANAGE_STATE(AfxGetStaticModuleState());


    麻烦把正确答案设为解答。

    我已经在调用DLL函数中添加了。

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    但是没用。还是出错。

    2010年5月19日 11:31
  • 在错误后中断返回的代码位置。

    第一次的中断位置:

    dbgrptt.c

    _CRTIMP void _cdecl _CrtDbgBreak(
        void
        )
    {
        DebugBreak();
    }                     //中断在此处

    第二次的中断位置

    dllinit.cpp

    #ifdef _AFX_OLE_IMPL
       
    // set module state for cleanup
    ASSERT(AfxGetThreadState()->m_pPrevModuleState == NULL);  //中断到此处
        AfxGetThreadState()->m_pPrevModuleState =
        AfxSetModuleState(_AfxGetOleModuleState());

     

    请各位高人帮助看下是怎么回事。

     

     

    2010年5月19日 12:11
  • 输出窗口有显示错误信息吗?

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月19日 13:34
    版主
  • 输出窗口有显示错误信息吗?

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP


    没有。编译是正确的。

    我还另写了个测试程序,程序什么都没做,只是调用一个MFC DLL。然后DLL中载入一个非模态对话框,增加一个组合框控件,关联一个变量m_testcombo,然后写入如下代码都出错。

    BOOL CTestDlg::OnInitDialog()
    {
        m_testcombo.AddString(_T(
    "北京"));   //由中断知此处出错。
        return TRUE;
    }

    2010年5月19日 13:55
  • 调试窗口也有输出信息的。

    不过你上面的代码即使不是DLL也会出错,因为没有调用基类的实现,所以m_testcombo没有通过DDX子类化对话框上的窗口。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月19日 18:27
    版主
  • 调试窗口也有输出信息的。

    不过你上面的代码即使不是DLL也会出错,因为没有调用基类的实现,所以m_testcombo没有通过DDX子类化对话框上的窗口。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP

    呵是啊。这个问题我搞了好久。昨天在英文论坛上有人也这样说,加上基类后已经成功了。
    2010年5月20日 4:46