|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Nov 01 01:00:01 2025 UTC |
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.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>