ID: 22899 Updated by: [EMAIL PROTECTED] Reported By: rich at kastle dot com -Status: Verified +Status: Closed Bug Type: COM related Operating System: Windows NT 4.0 SP6 PHP Version: 4.3.2RC1 New Comment:
This bug has been fixed in CVS. In case this was a PHP problem, snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. In case this was a documentation problem, the fix will show up soon at http://www.php.net/manual/. In case this was a PHP.net website problem, the change will show up on the PHP.net site and on the mirror sites in short time. Thank you for the report, and for helping us make PHP better. commited. Previous Comments: ------------------------------------------------------------------------ [2003-03-27 02:51:24] [EMAIL PROTECTED] change status. ------------------------------------------------------------------------ [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