#i'm investigating this ...
+----------------------------------------------------------------------+
*/
-
/*
* This module implements support for COM components that support the IDispatch
* interface. Both local (COM) and remote (DCOM) components can be accessed.
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)
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;
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;
#if PHP_WIN32
-#include "unknwn.h"
+#include "oleauto.h"
typedef struct i_dispatch_ {
int typelib;
+/*
+ +----------------------------------------------------------------------+
+ | 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"
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:
break;
case VT_DISPATCH: {
pval *handle;
+ i_dispatch *obj;
pval_arg->type=IS_OBJECT;
pval_arg->value.obj.ce = &com_class_entry;
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:
#if PHP_WIN32
+BEGIN_EXTERN_C()
+
#include "com.h"
extern PHP_MINIT_FUNCTION(COM);
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
+----------------------------------------------------------------------+
*/
-
/*
* This module implements support for COM components that support the IDispatch
* interface. Both local (COM) and remote (DCOM) components can be accessed.
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)
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;
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;
#if PHP_WIN32
-#include "unknwn.h"
+#include "oleauto.h"
typedef struct i_dispatch_ {
int typelib;
+/*
+ +----------------------------------------------------------------------+
+ | 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"
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:
break;
case VT_DISPATCH: {
pval *handle;
+ i_dispatch *obj;
pval_arg->type=IS_OBJECT;
pval_arg->value.obj.ce = &com_class_entry;
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:
#if PHP_WIN32
+BEGIN_EXTERN_C()
+
#include "com.h"
extern PHP_MINIT_FUNCTION(COM);
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