3

I'm working with a COM object that returns a multidimensional VARIANT array (vt_array), and I'm trying to read values from the array.

When I use print_r($mdArray) it displays variant Object. (variant_get_type($mdArray) returns 8204.)

I tried using foreach ($mdArray as $oneArray) but I get the message:

Warning: Loader::getfields() [loader.getfields]: Can only handle single dimension variant arrays (this array has 2) in C:\Inetpub\wwwroot\root\script\fileloader.php on line 135 Fatal error: Uncaught exception 'Exception' with message 'Object of type variant did not create an Iterator' in C:\Inetpub\wwwroot\root\script\fileloader.php:135 Stack trace: #0 C:\Inetpub\wwwroot\root\script\fileloader.php(135): Loader::getfields() #1 C:\Inetpub\wwwroot\root\testloader.php(21): Loader->getfields() #2 {main} thrown in C:\Inetpub\wwwroot\root\script\fileloader.php on line 135

(The foreach loop is on line 135)

The only information I can get about the array is by using count($mdArray) which returns 8.

If anyone here has any experience reading from multidimensional VARIANT arrays please tell me how this can be done.

john
  • 33
  • 1
  • 3
  • do you know the exact class/type of the array from whichever language the com object is written in? Already I fear you may have to try parsing the array in VB... Hint: `$vb_control = new COM("MSScriptControl.ScriptControl");` – bob-the-destroyer Jan 26 '11 at 02:49
  • also have you tried a `for ($x=0; $x < count($mdArray); $x++) $oneArray = $mdArray[$x];` loop instead? – bob-the-destroyer Jan 26 '11 at 02:57
  • I tried $oneArray = $mdArray[0] and the whole script crashed with this messsage: FastCGI Error The FastCGI Handler was unable to process the request. Error Details: * The FastCGI process exited unexpectedly * Error Number: -2147467259 (0x80004005). * Error Description: Unspecified error HTTP Error 500 - Server Error. Internet Information Services (IIS) – john Jan 26 '11 at 03:28
  • The only thing I know about it is that it's a multidimensional array and each individual array contains 2 strings. I don't know how the array was implemented or the class/type used to create the array. I'm new at this job and I'm' trying to use a COM object that was programmed by someone who left the company and whom I cannot contact. – john Jan 26 '11 at 03:30

1 Answers1

4

Try this to extract array values through "VBScript". Yes, you read that right...

<?php

$com = new COM("MSScriptControl.ScriptControl");
$com->Language = 'VBScript';
$com->AllowUI = false;
$com->AddCode('
    Function getArrayVal(arr, indexX, indexY)
        getArrayVal = arr(indexX, indexY)
    End Function
');

$y1 = 0;
$y2 = 1;
for ($x=0; $x < count($mdArray); $x++) {
    echo $com->Run('getArrayVal', $mdArray, $x, $y1) . ": ";
    echo $com->Run('getArrayVal', $mdArray, $x, $y2) . "\n";
    }

?>

Tested good on a VBScript-created array, which otherwise gave me the exact same issues and errors as you when trying to coerce it to behave like a PHP array. The above method spawned by the unholy union of PHP and VBscript should extract values piece by piece just fine.

To explain $y1 = 0; $y2 = 1;, keep in mind the parameters of the VBScript function are byref, so you can't pass anything in except a variable.

Edit: Added $com->AllowUI = false to shut off any on-screen popups. Otherwise it would freeze the request if a MsgBox() somehow got called from VBScript and no one was at the server terminal to click 'ok'.

bob-the-destroyer
  • 3,164
  • 2
  • 23
  • 30
  • That's brilliant! Thank you so much! This code worked great. (I don't have enough reputation to upvote your answer, but I really appreciate it.) Is it possible to reverse this script so I can create multidimensional arrays to send to a COM object? – john Jan 26 '11 at 05:50
  • 1
    Thanks! Unfortunately, you run into the same problem when going in reverse. You can however foeach loop over it in VBScript. The only thing I can think of is making a VBScript function to 1) take in a PHP multidimensional array, 2) use nested foreach loops over it building a completely new valid array, 3) return that to PHP to then be returned to your COM object. – bob-the-destroyer Jan 26 '11 at 07:00
  • @bob-the-destroyer your answer gave me an idea of how to go about a scenario of this type. I have a COM object in Php returning object(variant)#3(0){ } when I issue var_dump($myArrayObject); how would I handle this one? – Joseph Feb 10 '17 at 17:04
  • @bob-the-destroyer would you mind helping me with this Question here http://stackoverflow.com/questions/42166123/how-to-loop-thru-and-output-values-of-a-variant-array-object-in-php – Joseph Feb 10 '17 at 18:35