我正在使用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中尝试了相同的参数,并且工作正常。
答案 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
错误消息在大多数情况下指向正确的参数位置是不可靠的。