php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #11658 Getting values by reference don't work
Submitted: 2001-06-25 09:00 UTC Modified: 2001-07-23 13:50 UTC
From: andrej dot aschenbrenner at face dot de Assigned:
Status: Closed Package: COM related
PHP Version: 4.0.6 OS: Windows NT 4.0 SP 6
Private report: No CVE-ID: None
 [2001-06-25 09:00 UTC] andrej dot aschenbrenner at face dot de
Example:

$user = "test_user";
$allowed = 8;

$instance = new COM("dll.CObject") or die("Unable to
instanciate dll.CObject");
$instance->CheckLogin($user, COM_REMOTE_SERVER, &$allowed);

echo $allowed;

$allowed has always the value that you have specified
above, here: 8; When I change $allowed to 6788, then
I get 6788. It seems that the variable won't be changed
when you pass it by reference.
It doesn't matter if i use the & sign or not!
Note that the variable $allowed have to be integer,
I can't pass a variant type to the COM-Function CheckLogin.

The same has been working with previous versions of PHP,
until 4.0.5 and above.

In need this functionality because i use a lot of stuff
like that: 

$instance->some_function(&$var1, &$var2, &$var3);

any clue, what's going up?


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-06-25 17:21 UTC] jeroen@php.net
Was submitted twice. Dup. of 11660
 [2001-06-26 07:00 UTC] sniper@php.net
The #11660 was already bogused. Reopened this one.

 [2001-06-26 10:19 UTC] phanto@php.net
$user = "test_user";
$allowed = new VARIANT(8, VT_I4|VT_BYREF);

$instance = new COM("dll.CObject") or die("Unable to
instanciate dll.CObject");
$instance->CheckLogin($user, COM_REMOTE_SERVER, $allowed);

echo $allowed->value;

/* you can use $allowed->type to check it against
 * VT_* constants
 * look into the php documentation for more flags
 * passing variables by reference is a deprecated
 * zend feature (i don't know why) and it didn't work
 * in every case in earlier versions.
 */


 [2001-06-26 10:19 UTC] phanto@php.net
closed
 [2001-06-27 04:16 UTC] andrej dot aschenbrenner at face dot de
It didn't work!
I get this:

Warning: Invoke() failed: Typ pa?t nicht.
in D:\www\webze\application\index.php on line 10

translated: ...: Type mismatch.

Line 10 looks like this:
$instance->CheckLogin($user, COM_REMOTE_SERVER, $allowed);

I have tried all of the combinations I could think of,
VT_UI1|BYREF, VT_UI2|BYREF, VT_UI4|BYREF, VT_I1|BYREF,
VT_I2|BYREF, VT_I4|BYREF, VT_INT|BYREF, VT_UINT|BYREF
It doesn't matter. I get always the same type mismatch warning.

Note that the variable $allowed in the function of the
COM-Object is defined as "long".

Please help me to get this working.

 [2001-06-28 03:12 UTC] andrej dot aschenbrenner at face dot de
still closed?
 [2001-07-01 17:25 UTC] phanto@php.net
type mismatch means, that your com object expects another type. as you see the error message is german so the error doesn't happen in php but in the com-marshaller. you have to check what type your object expects and change the VT_I4 to the corresponding value.

if you can provide me an other example so that i can reproduce this on my machine i could help you more detailed
 [2001-07-02 05:08 UTC] andrej dot aschenbrenner at face dot de
I think it's very simple.

The COM-Object that I use is compiled with
Microsoft Visual C++ 6.0, if it matters.


The definition looks like this:

interface ICObject: IDispatch
{
  [id(1), helpstring("Methode Init")]
          HRESULT Init(BSTR bstrUser,
                       long lwinID,
                       BSTR bstrCustomer);
  [id(2), helpstring("Methode CheckLogin")]
          HRESULT CheckLogin(BSTR bstrUser,
                             BSTR bstrServer,
                             long *laccess);
  [id(3), helpstring("Methode CloseData")]
          HRESULT CloseData();
};

Note, that there is no VARIANT Type!
It's only BSTR and LONG.
So I get always a type mismatch, when I try to pass
variables with
$var = new VARIANT(8, VT_I4|VT_BYREF);
or 
$var = new VARIANT("test", VT_BSTR);
It doesn't matter, if it's passed by reference or not.
I think it's a more general problem. PHP tries to pass
the values as type VARIANT, but the interface is of another
type (here BSTR or LONG). Of course, I could be wrong.
When I pass the values directly as PHP-variables, then I
don't get the type-mismatch warning, but the variables
passed by reference don't change, as you can see in the
first message.

I hope, I maked it clear.


 [2001-07-05 20:43 UTC] phanto@php.net
but by definition every interface derived from IDispatch that should support references must expect VARIANT *var instead of <anothertype> *var . am i wrong ?
 [2001-07-23 13:50 UTC] phanto@php.net
doesn't work with VBScript either and due to the provided typelib i assume that it is a user (component) error.

-harald.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Apr 19 21:01:30 2024 UTC