ID: 22899 Updated by: [EMAIL PROTECTED] Reported By: rich at kastle dot com -Status: Open +Status: Verified Bug Type: COM related Operating System: Windows NT 4.0 SP6 PHP Version: 4.3.2RC1 New Comment:
change status. Previous Comments: ------------------------------------------------------------------------ [2003-03-27 02:50:23] [EMAIL PROTECTED] can you please send an unified diff (diff -u) per mail directly to me. ------------------------------------------------------------------------ [2003-03-26 07:51:15] rich at kastle dot com If php_COM_invoke receives an error as a result of trying to invoke a COM method via C_TYPEINFO_VT(obj)->Invoke, it assumes that the dispatch failed and tries again using C_DISPATCH_VT(obj)->Invoke. However, if the first Invoke succeeds (i.e. actually call into the object method) but the method raises a COM exception, it returns DISP_E_EXCEPTION. php_COM_invoke will then call the same method again using C_DISPATCH_VT. (In my particular case, the COM method was performing some subsequent phases of a larger DB transaction, encountered a deadlock, then rolled back the DB transaction and reported the event by raising an exception. php_COM_invoke swallowed the exception without report and invoked the method again, which, this time, did not encounter the same deadlock, leaving my code without knowledge that a deadlock had caused some of my DB updates to be rolled back. It took me four days to figure out what in the world was happening.) Here's a diff against COM.c which checks for DISP_E_EXCEPTION as a special case. (This diff is against 4.3.2RC1 but AFAICS this error has existed all along.) diff -r temp/php-4.3.2RC1\ext\com\COM.c php-4.3.2RC1\ext\com\COM.c 128,129c128,130 < hr = C_DISPATCH_VT(obj)->Invoke(C_DISPATCH(obj), dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pDispParams, pVarResult, &ExceptInfo, &ArgErr); < if (SUCCEEDED(hr)) { --- > if(hr != DISP_E_EXCEPTION) { > hr = > C_DISPATCH_VT(obj)->Invoke(C_DISPATCH(obj), dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pDispParams, pVarResult, &ExceptInfo, &ArgErr); > if (SUCCEEDED(hr)) { 131,137c132,139 < * ITypLib doesn't work < * Release ITypeLib and fall back to IDispatch < */ < < C_TYPEINFO_VT(obj)->Release(C_TYPEINFO(obj)); < C_HASTLIB(obj) = FALSE; < C_TYPEINFO(obj) = NULL; --- > * ITypLib doesn't work > * Release ITypeLib and fall back to IDispatch > */ > > > C_TYPEINFO_VT(obj)->Release(C_TYPEINFO(obj)); > C_HASTLIB(obj) = FALSE; > C_TYPEINFO(obj) = NULL; > } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=22899&edit=1