none
OCX实现COleControl::DoPropExchange时抛出异常 RRS feed

  • 问题

  • 用MFC做的 OCX 在 WinCE6 (CEPC) 中被MFC对话框调用时,OCX中实现 “COleControl::DoPropExchange” 的代码中,大约处理到21个数据时抛出异常:

    CArchive exception: endOfFile.
    Exception 'Raised Exception' (-1): Thread-Id=07040012(pth=82a3a624), Proc-Id=0703000e(pprc=82dd1950) 'test.exe', VM-active=0703000e(pprc=82dd1950) 'test.exe'
    PC=400426c3(coredll.dll+0x000326c3) RA=40d97acc(fiscn.ocx+0x00047acc) SP=002cda10, BVA=002cda68
    Error: failed to load AfxFormatString string 0xf1b3.
    Info: AfxDllCanUnloadNow returning S_OK

    请问这是什么原因,该如何处理?

    谢谢!

    2011年7月4日 1:19

答案

  • 经调试发现问题出在 PC 版本的OCX和WinCE上运行的OCX的序列化处理不一致,我没有对PC版的OCX作序列化处理,所以在资源文件里看到控件的初始化数据很少,在WinCE中通过序列化初始化控件时由于数据量不够导致抛出异常 (CArchive exception: endOfFile.)。

    修改后的问题:

    PC中的序列化处理和WinCE中的序列化处理好像起始部分不一样,调试时在进入“DoPropExchange”时查看序列化数据,在资源文件中可以找到,但偏移量不一致(WinXP上运行时,在资源中找到的偏移量约为“0x26”,  使用WM模拟器作为WinCE的模拟环境,在资源文件中找到的偏移量约为“0x04”),导致在IDE中设置的属性数据无法使用,请问原因所在及该如何处理。

    谢谢

     

    • 已标记为答案 MZHA 2012年12月5日 9:23
    2011年7月18日 5:17

全部回复

  • 您好,

    能提供更多的错误信息么,是不是宽字符的问题?

    致礼


    Jesse Jiang [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月5日 2:32
    版主
  • 你好

    (编译模式为“Debug”) 我把DoPropExchange里面的代码都放到 TRY{ } END_TRY 里面,程序才不会崩溃,以上是串口打印出来的全部信息;
    里面有处理的数据类型有 CString,BOOL,SHORT,LONG,FLOAT等,设置TCHAR为WCHAR(好像我使用的WinCE SDK不支持TCHAR为CHAR)。程序启动时第一次进入DoPropExchange时 “pPX->IsLoading”为TRUE。

    其中 “Error: failed to load AfxFormatString string 0xf1b3.” 是 SDK 中 “atlmfc\src\mfc\apphelp.cpp”中打印出来的(自然那个ASSERT(FALSE)也会弹出一个对话框),应该是异常处理时调用的,代码如下:

    void AFXAPI AfxFormatStrings(CString& rString, UINT nIDS,
      LPCTSTR const* rglpsz, int nString)
    {
     CString strFormat;
     if (!strFormat.LoadString(nIDS) != 0)
     {
      TRACE(traceAppMsg, 0, _T("Error: failed to load AfxFormatString string 0x%04x.\n"), nIDS);
      ASSERT(FALSE);
      return;
     }
     AfxFormatStrings(rString, strFormat, rglpsz, nString);
    }

    是不是宽字符的问题,我不是很清楚,在这里使用宽字符应该注意哪些问题。

     

    2011年7月5日 5:07
  • 经调试发现问题出在 PC 版本的OCX和WinCE上运行的OCX的序列化处理不一致,我没有对PC版的OCX作序列化处理,所以在资源文件里看到控件的初始化数据很少,在WinCE中通过序列化初始化控件时由于数据量不够导致抛出异常 (CArchive exception: endOfFile.)。

    修改后的问题:

    PC中的序列化处理和WinCE中的序列化处理好像起始部分不一样,调试时在进入“DoPropExchange”时查看序列化数据,在资源文件中可以找到,但偏移量不一致(WinXP上运行时,在资源中找到的偏移量约为“0x26”,  使用WM模拟器作为WinCE的模拟环境,在资源文件中找到的偏移量约为“0x04”),导致在IDE中设置的属性数据无法使用,请问原因所在及该如何处理。

    谢谢

     

    • 已标记为答案 MZHA 2012年12月5日 9:23
    2011年7月18日 5:17