PHP - 使用COM错误消息:参数5:类型不匹配

时间:2017-05-26 13:23:56

标签: php types vbscript com bstr

我正在使用PHP在IIS 7上使用类COM调用服务器上的对象。

该对象已经很好地创建了,但是当我使用它的方法时,PHP会返回此错误:

PHP Fatal error:  Uncaught exception 'com_exception' with message 'Parameter 5: Type mismatch.

参数$ bd。

中发生错误

我的PHP代码:

$oem = new COM("LogicControlOEM.OEM_EjecutaOEM") or die("ERROR");
var_dump($oem);

$empresa = 1;
$usuario = 'XXX';
$pass = 'XXX';
$proveedor = '';
$servidor = 'XXXX';
$bd = 'example'; // I tried to putting a (string) and (String) before

$oem->InicializaOEM($empresa, 
    $usuario, 
    $pass, 
    $proveedor, 
    $servidor, 
    $bd);

var_dump($oem);

$oem = null;

我得到了我想在组件中使用的功能:

HRESULT InicializaOEM(
                        [in, out] short* intEmpresa,
                        [in, out] BSTR* sUserName,
                        [in, out] BSTR* sPassword,
                        [in, out, optional] BSTR* sProvider,
                        [in, out, optional] BSTR* sDataSource,
                        [in, out, optional] BSTR* sCatalog);

什么类型的BSTR以及为什么只有最后一个参数出现问题?我认为是一种字符串的视觉基本变量...

我在文件.vbs中尝试了相同的参数,并且工作正常。

1 个答案:

答案 0 :(得分:1)

这是一个非常严格的COM方法签名,不知道是因为严格的要求还是糟糕的设计,你决定了。

给定IDL中的

out澄清了通过引用传递特定类型所需的所有参数,而不是变体。

即使在像VBScript这样几乎所有东西都是COM变种的环境中,如果在COM库中没有特殊处理,也不可能通过引用这样的方法传递参数,因为你可以' t在VBScript中声明强类型变量。

再次在VBScript中,有一个ByVal黑客,因此可以在参数周围添加额外的括号,因为知道如果在COM方法中进行修改,您将无法访问参数。但是,不幸的是,这个hack不适用于PHP的COM库。

你能做的最好的事情是我认为编写一个包含LogicControlOEM命名空间但在任何地方接受变量参数的COM库。

创建此类库的最简单环境当然是Visual Basic 6.0。请注意,它仅为32位。

BTW自2005年末以来,对PHP COM没有进行过重大维护。根据经验,我可以说com_exception错误消息在大多数情况下指向正确的参数位置是不可靠的。