Редактировать: Со времени моего первого поста я привел минимальный рабочий пример. В следующем коде, как мне получить доступ к содержимому $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 */ } }
Задача ещё не решена.
Других решений пока нет …