在PHP中显示VARIANT的内容

时间:2018-03-06 03:51:06

标签: php com

修改:自从我的第一篇文章以来,我提出了一个最小的工作示例。在下面的代码中,如何访问$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);

ab是标量时,一切正常。我遇到的问题(根据问题顶部的示例数据)是ab每个包含多个数字。

修改

的输出
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 */ } }

0 个答案:

没有答案