现在的位置: 首页 > 综合 > 正文

PHP调用MFC ActiveX控件接口时产生致命错误原因分析

2013年10月18日 ⁄ 综合 ⁄ 共 1969字 ⁄ 字号 评论关闭

在调用控件接口时出现如下错误信息:

Uncaught exception 'com_exception' with message 'Error [0x8000ffff] Catastrophic failure。

然而直接MFC对话框上调用没有问题。

 

原因如下:

SUMMARY  
  In   situations   where   an   OLE   container   doesn't   support   control   containment,   you   may   want   to   use   an   OLE   control   as   an   automation   server   to   gain   access   to   its   properties   and   methods.   This   article   explains   the   necessary   modifications   you   need   to   make   in   order   for   an   OLE   control   to   function   as   a   normal   automation   server.    
   
   
   
  MORE   INFORMATION  
  Prior   to   Visual   C++   4.0,   an   OLE   Control   could   be   used   as   an   automation   server   without   any   modification.   However,   in   MFC   4.0,   the   framework's   implementation   of   IDispatch::Invoke   calls   the   virtual   function   IsInvokeAllowed   to   determine   if   an   automation   server   is   in   the   appropriate   state   to   handle   automation   calls.   The   default   implementation   in   CCmdTarget::IsInvokeAllowed   returns   TRUE,   implying   that   a   server   can   handle   automation   calls.    
   
  In   the   case   of   an   OLE   control,   COleControl::IsInvokeAllowed   checks   to   see   if   the   control   has   been   either   initialized   or   loaded   properly   through   the   persistent   storage   interfaces.   If   the   control   has   the   appropriate   state   information,   then   this   function   returns   TRUE.   When   an   OLE   control   is   created   as   a   normal   automation   server,   it   is   not   created   as   an   embedding   in   the   client.   Hence,   none   of   the   persistent   state   initialization   will   take   place,   which   thereby   causes   IsInvokeAllowed   to   return   FALSE.   The   effect   of   this   is   that   a   call   to   an   automation   object   method   generates   a   run-time   error   of   (8000ffff)   :   "Catastrophic   failure".    
   
  In   order   to   use   an   OLE   control   only   as   an   automation   server,   you   need   to   override   COleControl::IsInvokeAllowed()   and   return   TRUE.   If   any   of   the   control's   properties   and   methods   should   not   be   accessed   when   invoked   as   a   normal   automation   server,   then   that   automation   function   could   be   bypassed   and/or   an   error   code   can   be   returned   when   COleControl::m_bInitialized   is   FALSE.  

所以直接重写下COleControl::IsInvokeAllowed()就可以解决问题.

 

抱歉!评论已关闭.