我的问题是this:
我正在使用PHP在IIS 7上使用类COM调用服务器上的对象。
该对象已经很好地创建了,但是当我使用它的方法时,PHP会返回此错误:
PHP Fatal error: Uncaught exception 'com_exception' with message 'Parameter 2: Type mismatch.
错误总是发生在最后一个参数中,无论错误是否实际存在于第一个参数中(我想是这样,因为在同一个组件中使用了另一个函数,我发送了所有变量并且都是字符串)。
我的PHP代码:
$com = new COM("LogicControlOEM.OEM_EjecutaOEM", NULL, CP_UTF8, 'LogicControlOEM') or die("Error al cargar el componente");
$empresa = 1;
$usuario = 'XXX';
$pass = 'XXX';
$com->InicializaOEM($empresa,
$usuario,
$pass);
var_dump($com);
$com = null;
我从函数中删除了可选值。你可以看到下面的代码。
我在文件.vbs中尝试了相同的参数,并且工作正常。
我正在打开一个新问题,因为它不同,我不知道Visual Basic脚本中的VT_PTR是什么类型,我想将php变量转换为此类型。
即使有可能,我也不知道。
我使用php函数com_print_typeinfo()
来查看组件内的代码:
com_print_typeinfo($com);
它显示了VBS(?)中的代码:
class _OEM_EjecutaOEM { /* GUID={XXXXXXX-XXXX-XXX-XXX-XXXXXXXXXXX} */
/* 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=1610809345 */
function CambiaEmpresa(
/* VT_PTR [26] [in][out] --> VT_I2 [2] */ &$intEmpresa
)
{
}
/* DISPID=1610809346 */
function InicializaOEM(
/* VT_PTR [26] [in][out] --> VT_I2 [2] */ &$intEmpresa,
/* VT_PTR [26] [in][out] --> VT_BSTR [8] */ &$sUserName,
/* VT_PTR [26] [in][out] --> VT_BSTR [8] */ &$sPassword,
/* VT_PTR [26] [in][out] --> VT_BSTR [8] */ &$sProvider,
/* VT_PTR [26] [in][out] --> VT_BSTR [8] */ &$sDataSource,
/* VT_PTR [26] [in][out] --> VT_BSTR [8] */ &$sCatalog
)
{
}
有人可以解释一下InicializaOEM功能是如何工作的吗? 为什么在变量之前显示注释?
任何想法都非常好。