|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2003-12-15 12:18 UTC] Regis dot Derimay at iQvolution dot com
Description:
------------
I call the following in PHP:
$x = new VARIANT(0.0, VT_R8 | VT_BYREF);
$y = new VARIANT(0.0, VT_R8 | VT_BYREF);
$z = new VARIANT(0.0, VT_R8 | VT_BYREF);
com_invoke($sphereIf, "getPosition", $x, $y, $z, false);
The getPosition function is defined by:
interface IiQSphereObjIf : IDispatch
{
[id(1), helpstring("method getPosition")] HRESULT getPosition([out] double* x, [out] double* y, [out] double* z, [in] VARIANT_BOOL globalTrafo, [out, retval] int* result);
};
I get the following error code
Warning: com_invoke(): Invoke() failed: Type mismatch. Argument: 2 in ...php
It seems to be a problem with the COM module when using functions with paramaters by reference (like x, y and z here).
When using normal parameters everything is working well.
Expected result:
----------------
Having x y and z filed with the position.
Actual result:
--------------
I get the following error code
Warning: com_invoke(): Invoke() failed: Type mismatch. Argument: 2 in ...php
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 02 18:00:01 2025 UTC |
Please try it without the reference flags: try { $x = new Variant(0.0); $y = new Variant(0.0); $z = new Variant(0.0); $sphere->getPosition($x, $y, $z, false); } catch (exception $e) { print_r($e); } If that doesn't work, can you please be more specific about what is going wrong (does it crash or does it throw an exception?). Please also include details about the "function that did not crash before (without the use of references)". Ideally, I want to be able to reproduce this on my machine here so I can debug it; is the component you are using publically available? (source preferred).Sorry, this report slipped through the cracks. I did however add automatic support for byref parameters, so the code below *should* work (no need to explicitly create variant objects for $x, $y, $z). Please let me know how you get on; try a recent PHP 5 snapshot (code was added a little while ago; beta 4 should work). iQlib = new COM("iQvolution.iQLibIf"); $iQlib->load("c:\\A.iQmod"); $numScans = $iQlib->getNumScans(); for($i = 0; $i < $numScans; $i++) { $objIf = $iQlib->getScanObject($i); $scanIf = $objIf->getScanObjSpecificIf(); $scanIf->getPosition($x, $y, $z, false); }Hi! Thanks for the answer. Now I am using PHP 5 beta 4. I use the php-cgi.exe version. I'm doing the following: <?php echo "Start"; try { $iQlib = new COM("iQvolution.iQLibIf"); } catch (exception $e) { echo "<PRE>"; print_r($e); echo "</PRE>"; } echo "End"; ?> It crashs echoing the following: Start com_exception Object ( [message:protected] => Failed to create COM object `iQvolution.iQLibIf': The specified module could not be found. [string:private] => [code:protected] => -2147024770 [file:protected] => C:\Documents and Settings\rd\My Documents\iQvolution\Develop\iQworks HTML\Debug\iQworks\ProjectManagement\COM.php [line:protected] => 5 [trace:private] => Array ( ) ) End Of course, it seems as the iQworks COM Obj is not registered, but this is not true as for example Excel with a visual basic script is working correctly. Do you want me to send you the dlls? Or do something that could help to debug the problem? Thanks! R?gisOk. Here the previous problem: I registered the iQopen.dll (COM) using regsvr32 on a path defined with a subst. The dos "subst" command allows to define a virtual harddrive under windows. Interesting enough, if you register your COM using a path based on a subst, PHP is not able to find the module (error of the previous message). But other tools like Excel are able to do it. So maybe you want to take a look on this. Now I am able to load the initial script under PHP 5 beta 4. I am doing the following: <?php try { $iQlib = new COM("iQvolution.iQLibIf"); $iQlib->load("c:\\A.iQmod"); $numScans = $iQlib->getNumScans(); echo "Nb of scans:{$numScans}<BR>\r\n"; for($i = 0; $i < $numScans; $i++) { $objIf = $iQlib->getScanObject($i); $scanName = $objIf->getName(); echo " Scan {$i}: {$scanName}<BR>\r\n"; $scanIf = $objIf->getScanObjSpecificIf(); $scanIf->getPosition($x, $y, $z, false); echo "$x"; } // $iQlib->Release(); $iQlib = null; } catch (exception $e) { echo "<PRE>"; print_r($e); echo "</PRE>"; } ?> It crashing with a "memory could not be written" message. It displays ------- Nb of scans:3 Scan 0: ------- So basically the same as beta 3. How can we solve the problem ??<?PHP $Vsheets1 = new VARIANT("", VT_BSTR); #No byRef - works $Vsheets2 = new VARIANT("", VT_BSTR|VT_BYREF); #Doesn't work ?>