|  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
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
Have you experienced this issue?
Rate the importance of this bug to you:

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

Reproduce code:

$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:


Add a Patch

Pull Requests

Add a Pull Request


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);

It throws an error: Fatal error: Uncaught exception 'com_exception' with message 'Variant type conversion failed: Type mismatch.
 [2016-12-31 00:11 UTC]
-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
 [2019-10-18 11:49 UTC]
-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]
Assigning to cmb for review as he's the new maintainer for COM.
 [2020-02-06 09:35 UTC]
-Status: Assigned +Status: Verified -Assigned To: cmb +Assigned To:
 [2020-02-06 09:35 UTC]
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] <>
[2] <>
[3] <>
[4] <>
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Jul 13 21:01:28 2024 UTC