Browse Source

removed itypeinfo calls because they didn't work on every machine

#i'm investigating this ...
PHP-4.0.6
Harald Radi 25 years ago
parent
commit
8dc2dbaf9b
  1. 22
      ext/com/COM.c
  2. 2
      ext/com/com.h
  3. 39
      ext/com/conversion.c
  4. 4
      ext/com/php_COM.h
  5. 22
      ext/rpc/com/com_wrapper.c
  6. 2
      ext/rpc/com/com_wrapper.h
  7. 39
      ext/rpc/com/conversion.c
  8. 4
      ext/rpc/com/php_com.h

22
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;

2
ext/com/com.h

@ -3,7 +3,7 @@
#if PHP_WIN32
#include "unknwn.h"
#include "oleauto.h"
typedef struct i_dispatch_ {
int typelib;

39
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 <h.radi@nme.at> |
+----------------------------------------------------------------------+
*/
#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:

4
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

22
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;

2
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;

39
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 <h.radi@nme.at> |
+----------------------------------------------------------------------+
*/
#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:

4
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

Loading…
Cancel
Save