php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #23155 The COM interface can't support pass by reference
Submitted: 2003-04-10 11:22 UTC Modified: 2003-04-10 18:09 UTC
From: wanght at hotmail dot com Assigned:
Status: Not a bug Package: COM related
PHP Version: 4.3.1 OS: Window 2K English
Private report: No CVE-ID: None
View Add Comment Developer Edit
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please !
Your email address:
MUST BE VALID
Solve the problem:
21 + 18 = ?
Subscribe to this entry?

 
 [2003-04-10 11:22 UTC] wanght at hotmail dot com
I wrote a simple COM object using VC & ATL.

Here a part of code
HRESULT FetchValue([in, out]int* iValue, [out]int* iResult)

STDMETHODIMP CSimpleCom::FetchValue(int* iValue, int* iResult)
{
	int iTemp = *iValue + 10;
	*iValue = iTemp;
	*iResult = iTemp;
	return S_OK;
}

I wrote a PHP script to invoke this method. It can't get the new value from this function.

<?php
echo "Call Com Object<br>";
$instance = new COM("comtest.SimpleCom"); 

$value = 15; 
$result =10;
$instance->FetchValue(&$value, &$result);
echo "<b>Access function <i>void FetchValue(int*, int*): </i></b>";
echo "Output result: ".$result."<br>";
echo "Output value: ".$value."<br>";
$instance->release(); 
?>

After reading the source code, I found the function php_pval_to_variant in conversion.c didn't check if the variale is passed by reference. Am I right? Maybe this is the problem.

By the way, this is a little bug in the COM interface function.

php_VARIANT_call_function_handler (VARIANT.c)
call function VariantInit(), and then call php_pval_to_variant_ex(conversion.c) --> php_pval_to_variant_ex2(conversion.c), the function VariantInit() has been called again. 

But in another invocation path
do_COM_invoke(COM.c) -> php_pval_to_variant(conversion.c) -> php_pval_to_variant_ex2, the function VariantInit() is only invoked once.







Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-04-10 18:09 UTC] phanto@php.net
Sorry, but your problem does not imply a bug in PHP itself.  For a
list of more appropriate places to ask for help using PHP, please
visit http://www.php.net/support.php as this bug system is not the
appropriate forum for asking support questions. 

Thank you for your interest in PHP.

call time pass by reference is a deprecated feature, use the variant class instead.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Mar 28 10:01:26 2024 UTC