ID:               17012
 Updated by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
 Status:           Open
 Bug Type:         COM related
 Operating System: WinNT 2000
 PHP Version:      4.2.0
 New Comment:

The fix would be fine but the actual question is 'shouldn't they addref
it?'
afaik one should call addref each time an idispatch pointer is obtained
from somewhere and as we give it away _they_ (ADODB) obtain it and
should addref the pointer themselfes.
but during investigation i found some other flaws, maybe your problem
is related to them.


Previous Comments:
------------------------------------------------------------------------

[2002-05-05 08:38:39] [EMAIL PROTECTED]

hello
I wrote a script to access ADO database:
----------------------------------------------------
        $conn = new COM('ADODB.Connection');
                        
        $hr = $conn->Open('Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=test.mdb',"", "", 0);

        $oCmd = new COM('ADODB.Command');
        $oCmd->ActiveConnection = $conn;
        $oCmd->CommandText = "INSERT INTO config(storage) VALUES('testowa
wartosc')";
        $oCmd->CommandType = 1;

        $rs = $oCmd->Execute();
----------------------------------------------------
in line 
$oCmd->ActiveConnection = $conn;
there is created a zendval variable (result from assigning IDispatch
$conn to property) but $conn is not AddRef-ed...
When this invisible variable is destroyed it calls Release on IDispatch
from $conn -  But this dispatch is already 0-referenced.
I isolated the code in file COM.c in line 1142 (function
do_COM_propput):
---------------------------------------------------
        if (SUCCEEDED(hr)) {
                php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
        } else {
--------------------------------------------------
and changed to:
---------------------------------------------------
        if (SUCCEEDED(hr)) {
                if ( var_result->vt == VT_DISPATCH )
                        var_result->pdispVal->lpVtbl->AddRef(var_result->pdispVal);
                php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
        } else {
----------------------------------------------------
Is it a good solution? Or maybe I don't understand something?
Tristan Rybak

------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=17012&edit=1

Reply via email to