php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #41286 Variant VT_ARRAY of VT_UI1
Submitted: 2007-05-04 17:12 UTC Modified: 2020-02-06 09:35 UTC
Votes:18
Avg. Score:4.3 ± 1.1
Reproduced:13 of 15 (86.7%)
Same Version:1 (7.7%)
Same OS:8 (61.5%)
From: milman at gmx dot de Assigned:
Status: Verified Package: COM related
PHP Version: Next Minor Version OS: Windows
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: milman at gmx dot de
New email:
PHP Version: OS:

 

 [2007-05-04 17:12 UTC] milman at gmx dot de
Description:
------------
for calling navigate2 you need to pass array of byte.
that is not possible.



Reproduce code:
---------------
<?php

$ie = new COM("InternetExplorer.Application");

$ie->Visible = true;
$ie->Height    = 500 ;
$ie->Width     = 700 ;


$post = array (ord('p'),ord('='),ord('1')) ;
$v = new VARIANT($post, VT_ARRAY|VT_UI1); 

//postdata need to be array of byte

$ie->Navigate2("http://host/web/echo_request.php",0,'',$v) ;

?> 

Expected result:
----------------
posting data to web-server

Actual result:
--------------
com_exception

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-03-26 18:53 UTC] kaisellgren at gmail dot com
I am experiencing same problems.

$rng = new DOTNET("mscorlib", "System.Security.Cryptography.RNGCryptoServiceProvider");
$arr = array(0);
$v = new VARIANT($arr,VT_ARRAY | VT_UI1);
$rng->GetBytes($v);
unset($rng);

It throws an error: Fatal error: Uncaught exception 'com_exception' with message 'Variant type conversion failed: Type mismatch.
 [2016-12-31 00:11 UTC] cmb@php.net
-Package: Feature/Change Request +Package: COM related
 [2017-02-13 23:46 UTC] muithimwema at gmail dot com
I am having the same error. See my post on Stack Overflow here http://stackoverflow.com/questions/42189245/how-to-pass-an-array-of-bytes-reference-to-a-com-object-method
 [2019-10-18 11:49 UTC] girgias@php.net
-Operating System: +Operating System: Windows -PHP Version: 5.2.2 +PHP Version: Next Minor Version -Assigned To: +Assigned To: cmb
 [2019-10-18 11:49 UTC] girgias@php.net
Assigning to cmb for review as he's the new maintainer for COM.
 [2020-02-06 09:35 UTC] cmb@php.net
-Status: Assigned +Status: Verified -Assigned To: cmb +Assigned To:
 [2020-02-06 09:35 UTC] cmb@php.net
I had a closer look, and indeed, creating new typed array variants
is not supported.  E.g.

    new variant([1, 2, 3], VT_ARRAY|VT_UI1)

first creates an array of variants from the given PHP array, and
later calls VariantChangeType()[1] attemting to convert the array
of variants to an array of bytes; but that can't work, since

| Arrays of one type cannot be converted to arrays of another type
| with this function.

This is also noted in the sources[2], by the way.

variant_set_type() and variant_cast() have the same issue; the
docs[3] already point out that variant_cast() is just a wrapper
for VariantChangeType().

There is, however, a potential alternative, namely using a PHP
string to construct (or convert to) the variant:

    new variant('p=1', VT_ARRAY|VT_UI1)

This gives an array of *6* bytes, though, since internally the PHP
string is converted to BSTR, which is an array of WCHAR (16 byte
values), and apparently VariantChangeType() is quirky when
converting from VT_BSTR to VT_ARRAY|VT_UI1 (VectorFromBstr()[4]
shows the same behavior, though).  So for little-endian
architectures, every even element has the value zero.  Since it is
not allowed to unset() elements of a variant array, there is no
way to remove the unwanted elements, so this alternative is not
helpful either.

I see a few options to better support these kinds of array, but
I'm not yet sure which one to pursue.  I'm also not quite sure
whether the current behavior is a bug, or whether it merely
can/should be improved.

[1] <https://docs.microsoft.com/en-us/windows/win32/api/oleauto/nf-oleauto-variantchangetype>
[2] <https://github.com/php/php-src/blob/php-7.3.15RC1/ext/com_dotnet/com_variant.c#L473-L474>
[3] <https://www.php.net/manual/en/function.variant-cast.php>
[4] <https://docs.microsoft.com/en-us/windows/win32/api/oleauto/nf-oleauto-vectorfrombstr>
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 18:01:29 2024 UTC