From 8dc2dbaf9b1bad044e4f9bfa0fdfb417e4e3e79f Mon Sep 17 00:00:00 2001 From: Harald Radi Date: Wed, 2 May 2001 21:51:19 +0000 Subject: [PATCH] removed itypeinfo calls because they didn't work on every machine #i'm investigating this ... --- ext/com/COM.c | 22 +++++++++++++--------- ext/com/com.h | 2 +- ext/com/conversion.c | 39 +++++++++++++++++++++++++++++++-------- ext/com/php_COM.h | 4 ++++ ext/rpc/com/com_wrapper.c | 22 +++++++++++++--------- ext/rpc/com/com_wrapper.h | 2 +- ext/rpc/com/conversion.c | 39 +++++++++++++++++++++++++++++++-------- ext/rpc/com/php_com.h | 4 ++++ 8 files changed, 98 insertions(+), 36 deletions(-) diff --git a/ext/com/COM.c b/ext/com/COM.c index 1526b09e8a..ca26a5c66c 100644 --- a/ext/com/COM.c +++ b/ext/com/COM.c @@ -17,7 +17,6 @@ +----------------------------------------------------------------------+ */ - /* * This module implements support for COM components that support the IDispatch * interface. Both local (COM) and remote (DCOM) components can be accessed. @@ -93,22 +92,27 @@ static int php_COM_load_typelib(char *typelib_name, int mode); PHPAPI HRESULT php_COM_invoke(i_dispatch *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult) { +/* TODO: doesn't work if(obj->typelib) { - return obj->i.dispatch->lpVtbl->Invoke(obj->i.dispatch, dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, + return obj->i.typeinfo->lpVtbl->Invoke(obj->i.typeinfo, obj->i.dispatch, dispIdMember, wFlags, pDispParams, pVarResult, NULL, NULL); } else { - return obj->i.typeinfo->lpVtbl->Invoke(obj->i.typeinfo, obj->i.dispatch, dispIdMember, + return obj->i.dispatch->lpVtbl->Invoke(obj->i.dispatch, dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, + wFlags, pDispParams, pVarResult, NULL, NULL); + }*/ + return obj->i.dispatch->lpVtbl->Invoke(obj->i.dispatch, dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pDispParams, pVarResult, NULL, NULL); - } } PHPAPI HRESULT php_COM_get_ids_of_names(i_dispatch *obj, OLECHAR FAR* FAR* rgszNames, DISPID FAR* rgDispId) { +/* TODO: doesn't work if(obj->typelib) { - return obj->i.dispatch->lpVtbl->GetIDsOfNames(obj->i.dispatch, &IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId); - } else { return obj->i.typeinfo->lpVtbl->GetIDsOfNames(obj->i.typeinfo, rgszNames, 1, rgDispId); - } + } else { + return obj->i.dispatch->lpVtbl->GetIDsOfNames(obj->i.dispatch, &IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId); + }*/ + return obj->i.dispatch->lpVtbl->GetIDsOfNames(obj->i.dispatch, &IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId); } PHPAPI HRESULT php_COM_release(i_dispatch *obj) @@ -128,7 +132,7 @@ PHPAPI HRESULT php_COM_set(i_dispatch *obj, IDispatch FAR* pDisp, int cleanup) HRESULT hr; obj->i.dispatch = pDisp; - obj->typelib = !FAILED(obj->i.dispatch->lpVtbl->GetTypeInfo(obj->i.dispatch, 0, LANG_NEUTRAL, &obj->i.typeinfo)); + obj->typelib = !FAILED(obj->i.dispatch->lpVtbl->GetTypeInfo(obj->i.dispatch, 0, LANG_NEUTRAL, &(obj->i.typeinfo))); if(cleanup) { pDisp = NULL; @@ -701,7 +705,7 @@ VARIANT *_php_COM_get_property_handler(zend_property_reference *property_referen break; case OE_IS_METHOD: - var_result->pdispVal = obj_prop->i.dispatch; +// var_result->pdispVal = obj_prop->i.dispatch; efree(obj_prop); return var_result; break; diff --git a/ext/com/com.h b/ext/com/com.h index f111134eac..c9ab0e4349 100644 --- a/ext/com/com.h +++ b/ext/com/com.h @@ -3,7 +3,7 @@ #if PHP_WIN32 -#include "unknwn.h" +#include "oleauto.h" typedef struct i_dispatch_ { int typelib; diff --git a/ext/com/conversion.c b/ext/com/conversion.c index 044e142e25..14d5d13ce1 100644 --- a/ext/com/conversion.c +++ b/ext/com/conversion.c @@ -1,3 +1,21 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2001 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Harald Radi | + +----------------------------------------------------------------------+ + */ + #ifdef PHP_WIN32 #include "php.h" @@ -43,22 +61,22 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage) else if(!strcmp(pval_arg->value.obj.ce->name, "COM")) { pval **idispatch_handle; - IDispatch *i_dispatch; + i_dispatch *obj; int type; /* fetch the IDispatch interface */ zend_hash_index_find(pval_arg->value.obj.properties, 0, (void **) &idispatch_handle); - i_dispatch = (IDispatch *)zend_list_find((*idispatch_handle)->value.lval, &type); - if (!i_dispatch || (type != php_COM_get_le_idispatch())) + obj = (i_dispatch *)zend_list_find((*idispatch_handle)->value.lval, &type); + if (!obj || (type != php_COM_get_le_idispatch())) var_arg->vt = VT_EMPTY; else { - var_arg->vt = VT_DISPATCH; - var_arg->pdispVal = i_dispatch; + var_arg->vt = VT_DISPATCH; + var_arg->pdispVal = obj->i.dispatch; } } else - var_arg->vt = VT_DISPATCH; + var_arg->vt = VT_EMPTY; break; case IS_RESOURCE: @@ -488,6 +506,7 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent break; case VT_DISPATCH: { pval *handle; + i_dispatch *obj; pval_arg->type=IS_OBJECT; pval_arg->value.obj.ce = &com_class_entry; @@ -497,15 +516,19 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent zend_hash_init(pval_arg->value.obj.properties, 0, NULL, ZVAL_PTR_DTOR, 0); ALLOC_ZVAL(handle); + obj = emalloc(sizeof(i_dispatch)); + php_COM_set(obj, var_arg->pdispVal, TRUE); + handle->type = IS_LONG; - handle->value.lval = zend_list_insert(var_arg->pdispVal, php_COM_get_le_idispatch()); + handle->value.lval = zend_list_insert(obj, php_COM_get_le_idispatch()); pval_copy_constructor(handle); INIT_PZVAL(handle); zend_hash_index_update(pval_arg->value.obj.properties, 0, &handle, sizeof(pval *), NULL); } break; case VT_UNKNOWN: - var_arg->pdispVal->lpVtbl->Release(var_arg->pdispVal); +//wtf ?? + var_arg->pdispVal->lpVtbl->Release(var_arg->pdispVal); /* break missing intentionally */ case VT_I1: diff --git a/ext/com/php_COM.h b/ext/com/php_COM.h index 8468052393..5a3d1a01bb 100644 --- a/ext/com/php_COM.h +++ b/ext/com/php_COM.h @@ -3,6 +3,8 @@ #if PHP_WIN32 +BEGIN_EXTERN_C() + #include "com.h" extern PHP_MINIT_FUNCTION(COM); @@ -18,6 +20,8 @@ extern int php_COM_set_property_handler(zend_property_reference *property_refere extern char *php_COM_error_message(HRESULT hr); extern void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference); +END_EXTERN_C() + #define COM_module_ptr &COM_module_entry #else diff --git a/ext/rpc/com/com_wrapper.c b/ext/rpc/com/com_wrapper.c index 1526b09e8a..ca26a5c66c 100644 --- a/ext/rpc/com/com_wrapper.c +++ b/ext/rpc/com/com_wrapper.c @@ -17,7 +17,6 @@ +----------------------------------------------------------------------+ */ - /* * This module implements support for COM components that support the IDispatch * interface. Both local (COM) and remote (DCOM) components can be accessed. @@ -93,22 +92,27 @@ static int php_COM_load_typelib(char *typelib_name, int mode); PHPAPI HRESULT php_COM_invoke(i_dispatch *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult) { +/* TODO: doesn't work if(obj->typelib) { - return obj->i.dispatch->lpVtbl->Invoke(obj->i.dispatch, dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, + return obj->i.typeinfo->lpVtbl->Invoke(obj->i.typeinfo, obj->i.dispatch, dispIdMember, wFlags, pDispParams, pVarResult, NULL, NULL); } else { - return obj->i.typeinfo->lpVtbl->Invoke(obj->i.typeinfo, obj->i.dispatch, dispIdMember, + return obj->i.dispatch->lpVtbl->Invoke(obj->i.dispatch, dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, + wFlags, pDispParams, pVarResult, NULL, NULL); + }*/ + return obj->i.dispatch->lpVtbl->Invoke(obj->i.dispatch, dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pDispParams, pVarResult, NULL, NULL); - } } PHPAPI HRESULT php_COM_get_ids_of_names(i_dispatch *obj, OLECHAR FAR* FAR* rgszNames, DISPID FAR* rgDispId) { +/* TODO: doesn't work if(obj->typelib) { - return obj->i.dispatch->lpVtbl->GetIDsOfNames(obj->i.dispatch, &IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId); - } else { return obj->i.typeinfo->lpVtbl->GetIDsOfNames(obj->i.typeinfo, rgszNames, 1, rgDispId); - } + } else { + return obj->i.dispatch->lpVtbl->GetIDsOfNames(obj->i.dispatch, &IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId); + }*/ + return obj->i.dispatch->lpVtbl->GetIDsOfNames(obj->i.dispatch, &IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId); } PHPAPI HRESULT php_COM_release(i_dispatch *obj) @@ -128,7 +132,7 @@ PHPAPI HRESULT php_COM_set(i_dispatch *obj, IDispatch FAR* pDisp, int cleanup) HRESULT hr; obj->i.dispatch = pDisp; - obj->typelib = !FAILED(obj->i.dispatch->lpVtbl->GetTypeInfo(obj->i.dispatch, 0, LANG_NEUTRAL, &obj->i.typeinfo)); + obj->typelib = !FAILED(obj->i.dispatch->lpVtbl->GetTypeInfo(obj->i.dispatch, 0, LANG_NEUTRAL, &(obj->i.typeinfo))); if(cleanup) { pDisp = NULL; @@ -701,7 +705,7 @@ VARIANT *_php_COM_get_property_handler(zend_property_reference *property_referen break; case OE_IS_METHOD: - var_result->pdispVal = obj_prop->i.dispatch; +// var_result->pdispVal = obj_prop->i.dispatch; efree(obj_prop); return var_result; break; diff --git a/ext/rpc/com/com_wrapper.h b/ext/rpc/com/com_wrapper.h index f111134eac..c9ab0e4349 100644 --- a/ext/rpc/com/com_wrapper.h +++ b/ext/rpc/com/com_wrapper.h @@ -3,7 +3,7 @@ #if PHP_WIN32 -#include "unknwn.h" +#include "oleauto.h" typedef struct i_dispatch_ { int typelib; diff --git a/ext/rpc/com/conversion.c b/ext/rpc/com/conversion.c index 044e142e25..14d5d13ce1 100644 --- a/ext/rpc/com/conversion.c +++ b/ext/rpc/com/conversion.c @@ -1,3 +1,21 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2001 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Harald Radi | + +----------------------------------------------------------------------+ + */ + #ifdef PHP_WIN32 #include "php.h" @@ -43,22 +61,22 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage) else if(!strcmp(pval_arg->value.obj.ce->name, "COM")) { pval **idispatch_handle; - IDispatch *i_dispatch; + i_dispatch *obj; int type; /* fetch the IDispatch interface */ zend_hash_index_find(pval_arg->value.obj.properties, 0, (void **) &idispatch_handle); - i_dispatch = (IDispatch *)zend_list_find((*idispatch_handle)->value.lval, &type); - if (!i_dispatch || (type != php_COM_get_le_idispatch())) + obj = (i_dispatch *)zend_list_find((*idispatch_handle)->value.lval, &type); + if (!obj || (type != php_COM_get_le_idispatch())) var_arg->vt = VT_EMPTY; else { - var_arg->vt = VT_DISPATCH; - var_arg->pdispVal = i_dispatch; + var_arg->vt = VT_DISPATCH; + var_arg->pdispVal = obj->i.dispatch; } } else - var_arg->vt = VT_DISPATCH; + var_arg->vt = VT_EMPTY; break; case IS_RESOURCE: @@ -488,6 +506,7 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent break; case VT_DISPATCH: { pval *handle; + i_dispatch *obj; pval_arg->type=IS_OBJECT; pval_arg->value.obj.ce = &com_class_entry; @@ -497,15 +516,19 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent zend_hash_init(pval_arg->value.obj.properties, 0, NULL, ZVAL_PTR_DTOR, 0); ALLOC_ZVAL(handle); + obj = emalloc(sizeof(i_dispatch)); + php_COM_set(obj, var_arg->pdispVal, TRUE); + handle->type = IS_LONG; - handle->value.lval = zend_list_insert(var_arg->pdispVal, php_COM_get_le_idispatch()); + handle->value.lval = zend_list_insert(obj, php_COM_get_le_idispatch()); pval_copy_constructor(handle); INIT_PZVAL(handle); zend_hash_index_update(pval_arg->value.obj.properties, 0, &handle, sizeof(pval *), NULL); } break; case VT_UNKNOWN: - var_arg->pdispVal->lpVtbl->Release(var_arg->pdispVal); +//wtf ?? + var_arg->pdispVal->lpVtbl->Release(var_arg->pdispVal); /* break missing intentionally */ case VT_I1: diff --git a/ext/rpc/com/php_com.h b/ext/rpc/com/php_com.h index 8468052393..5a3d1a01bb 100644 --- a/ext/rpc/com/php_com.h +++ b/ext/rpc/com/php_com.h @@ -3,6 +3,8 @@ #if PHP_WIN32 +BEGIN_EXTERN_C() + #include "com.h" extern PHP_MINIT_FUNCTION(COM); @@ -18,6 +20,8 @@ extern int php_COM_set_property_handler(zend_property_reference *property_refere extern char *php_COM_error_message(HRESULT hr); extern void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference); +END_EXTERN_C() + #define COM_module_ptr &COM_module_entry #else -- 2.50.1