Bug #11658 Updated: Getting values by reference don't work
| From: | andrej dot aschenbrenner at face dot de | Date: | Mon, 02 Jul 2001 09:08:05 +0000 |
| Subject: | Bug #11658 Updated: Getting values by reference don't work | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-58655@lists.php.net to get a copy of this message | ||
ID: 11658
User Update by: andrej.aschenbrenner@face.de
Status: Open
Bug Type: COM related
Operating system: Windows NT 4.0 SP 6
PHP Version: 4.0.6
Description: Getting values by reference don't work
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.
Previous Comments:
---------------------------------------------------------------------------
[2001-07-01 17:25:28] 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-06-28 03:12:59] andrej.aschenbrenner@face.de
still closed?
---------------------------------------------------------------------------
[2001-06-27 04:16:21] andrej.aschenbrenner@face.de
It didn't work!
I get this:
Warning: Invoke() failed: Typ paßt nicht.
in D:wwwwebzeapplicationindex.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-26 10:19:19] phanto@php.net
closed
---------------------------------------------------------------------------
[2001-06-26 10:19:03] 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.
*/
---------------------------------------------------------------------------
The remainder of the comments for this report are too long.
To view the rest of the comments, please
view the bug report online.
Full Bug description available at: http://bugs.php.net/?id=11658