com — Отображение содержимого VARIANT в переполнении стека

Редактировать: Со времени моего первого поста я привел минимальный рабочий пример. В следующем коде, как мне получить доступ к содержимому $testvar? Соответствующие места показаны с <--- комментарии в следующем коде.

$a = array(1.1,2.2);
$b = array(6.6,7.7);
$testvar = new VARIANT($a,VT_ARRAY|VT_VARIANT);
$testvar[0] = new VARIANT($a,VT_ARRAY|VT_VARIANT);
$testvar[1] = new VARIANT($b,VT_ARRAY|VT_VARIANT);
print "Count: ".count($testvar)."<br />\n";
print "Variant type: ";
print variant_get_type($testvar);
print "<br />\n";
print "var_dump: ";
var_dump($testvar);
print "<br />\n";
//print $testvar[0]; // <- How do I access the elements of the VARIANT ?????
foreach($testvar as $val)
{
print count($val);
print "<br />\n";
print $val[0];   // <- How do I access the elements of the VARIANT ?????
print "<br />\n";
}

Обратите внимание, что я знаю об этом вопросе и ответе (Как вы читаете из многомерного варианта массива, возвращенного из COM-объекта в PHP?) но, к сожалению, решение использует 32-битный COM-контроль, и я ограничен 64-битной платформой.

%%%%%%%%%%%%%%%%%% Исходное сообщение следует за %%%%%%%%%%%%%%%%%%%%%

Я вызываю COM-объект из PHP, но у меня возникают проблемы при печати содержимого возвращаемой переменной, когда это VARIANT.

Я начинаю с очень простого COM-объекта, который просто добавляет два числа вместе. Следующий код работает нормально, и отображает номер 3:

$my_dll = new COM('write_data_type.Class1');
$my_dll->write_data_type(1, $outvar, 1.0, 2.0);
echo $outvar;

Однако я не могу понять, как работать с массивами данных. Следующий код работает, так как он вызывает метод COM, не выдавая ошибку:

$a = Array(1.0,2.0);
print_r(array_values($a));

$b = Array(7.0,5.0);
print_r(array_values($b));

$my_dll = new COM('write_data_type.Class1');
$my_dll->write_data_type(1, $outvar, $a, $b);

Однако я не могу понять, как получить доступ или отобразить значение $outvar,

Если я использую:

var_dump($outvar);

затем напечатано следующее,

объект (вариант) # 2 (0) {}

Однако я понятия не имею, что это значит. Есть ли документация, описывающая, что #2, (0) и { } имею в виду?

Неудивительно, что следующее не удается с сообщением о том, что переменная не является массивом.

print_r(array_values($outvar));

Может кто-нибудь сказать мне, как отобразить содержимое $outvar (или VARIANT в целом), а также извлечь его элементы?

Если это полезно, то прототип для вызываемой функции

/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *write_data_type )(
IClass1 * This,
/* [in] */ long nargout,
/* [out][in] */ VARIANT *c,
/* [in] */ VARIANT a,
/* [in] */ VARIANT b);

Все отлично работает когда a а также b скаляры Проблема, с которой я сталкиваюсь (согласно данным примера в верхней части вопроса), заключается в a а также b каждый содержит более 1 номера.

РЕДАКТИРОВАТЬ:
Выход из

com_print_typeinfo($outvar);

есть: (мое форматирование)

class IClass1 { /* GUID={0FE9C130-58E3-4E35-BC23-11CF1280BB7D} */
/* DISPID=1610612736 */
function QueryInterface(
/* VT_PTR [26] [in] --> ? [29] */ &$riid,
/* VT_PTR [26] [out] --> VT_PTR [26] */ &$ppvObj ) { } /* DISPID=1610612737 */ /* VT_UI4 [19] */

function AddRef( ) { } /* DISPID=1610612738 */ /* VT_UI4 [19] */

function Release( ) { } /* DISPID=1610678272 */

function GetTypeInfoCount(
/* VT_PTR [26] [out] --> VT_UINT [23] */ &$pctinfo ) { } /* DISPID=1610678273 */

function GetTypeInfo(
/* VT_UINT [23] [in] */ $itinfo,
/* VT_UI4 [19] [in] */ $lcid,
/* VT_PTR [26] [out] --> VT_PTR [26] */ &$pptinfo ) { } /* DISPID=1610678274 */

function GetIDsOfNames(
/* VT_PTR [26] [in] --> ? [29] */ &$riid,
/* VT_PTR [26] [in] --> VT_PTR [26] */ &$rgszNames,
/* VT_UINT [23] [in] */ $cNames,
/* VT_UI4 [19] [in] */ $lcid,
/* VT_PTR [26] [out] --> VT_I4 [3] */ &$rgdispid ) { } /* DISPID=1610678275 */

function Invoke(
/* VT_I4 [3] [in] */ $dispidMember,
/* VT_PTR [26] [in] --> ? [29] */ &$riid,
/* VT_UI4 [19] [in] */ $lcid,
/* VT_UI2 [18] [in] */ $wFlags,
/* VT_PTR [26] [in] --> ? [29] */ &$pdispparams,
/* VT_PTR [26] [out] --> VT_VARIANT [12] */ &$pvarResult,
/* VT_PTR [26] [out] --> ? [29] */ &$pexcepinfo,
/* VT_PTR [26] [out] --> VT_UINT [23] */ &$puArgErr ) { } /* DISPID=1 */ /* VT_PTR [26] */ /* property MWFlags */ var $MWFlags; /* DISPID=1 */ /* property MWFlags */ var $MWFlags; /* DISPID=2 */

function write_data_type(
/* VT_I4 [3] [in] */ $nargout,
/* VT_PTR [26] [in][out] --> VT_VARIANT [12] */&$c,
/* VT_VARIANT [12] [in] */$a,
/* VT_VARIANT [12] [in] */ $b){ /* Method write_data_type */ } /* DISPID=3 */

function MCRWaitForFigures( ) { /* Method MCRWaitForFigures */ } }

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector