修改:自从我的第一篇文章以来,我提出了一个最小的工作示例。在下面的代码中,如何访问$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";
}
另请注意,我知道这个问题和答案(How do you read from a multidimensional variant array returned from a COM object in PHP?),但不幸的是,那里的解决方案使用32位COM控制,而我只能使用64位平台。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
我正在从PHP调用COM对象,但是当它是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
每个包含多个数字。
修改
的输出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 */ } }