33 CONST_VTBL
struct IDispatchExVtbl *
lpVtbl;
51static inline void trace(
char *fmt, ...)
57 OutputDebugString(
buf);
62 OutputDebugString(
buf);
68#define FETCH_DISP(methname) \
69 php_dispatchex *disp = (php_dispatchex*)This; \
70 if (COMG(rshutdown_started)) { \
71 trace(" PHP Object:%p (name:unknown) %s\n", Z_OBJ(disp->object), methname); \
73 trace(" PHP Object:%p (name:%s) %s\n", Z_OBJ(disp->object), ZSTR_VAL(Z_OBJCE(disp->object)->name), methname); \
75 if (GetCurrentThreadId() != disp->engine_thread) { \
76 return RPC_E_WRONG_THREAD; \
79static HRESULT STDMETHODCALLTYPE disp_queryinterface(
86 if (IsEqualGUID(&IID_IUnknown, riid) ||
87 IsEqualGUID(&IID_IDispatch, riid) ||
88 IsEqualGUID(&IID_IDispatchEx, riid) ||
89 IsEqualGUID(&disp->sinkid, riid)) {
91 InterlockedIncrement(&disp->refcount);
99static ULONG STDMETHODCALLTYPE disp_addref(IDispatchEx *This)
103 return InterlockedIncrement(&disp->refcount);
106static ULONG STDMETHODCALLTYPE disp_release(IDispatchEx *This)
111 ret = InterlockedDecrement(&disp->refcount);
112 trace(
"-- refcount now %lu\n",
ret);
115 disp_destructor(disp);
120static HRESULT STDMETHODCALLTYPE disp_gettypeinfocount(
130static HRESULT STDMETHODCALLTYPE disp_gettypeinfo(
142static HRESULT STDMETHODCALLTYPE disp_getidsofnames(
154 for (i = 0; i < cNames; i++) {
162 ret = DISP_E_UNKNOWNNAME;
165 rgDispId[i] = (DISPID)
Z_LVAL_P(tmp);
175static HRESULT STDMETHODCALLTYPE disp_invoke(
181 DISPPARAMS *pDispParams,
183 EXCEPINFO *pExcepInfo,
186 return This->lpVtbl->InvokeEx(This, dispIdMember,
187 lcid, wFlags, pDispParams,
188 pVarResult, pExcepInfo,
NULL);
191static HRESULT STDMETHODCALLTYPE disp_getdispid(
197 HRESULT
ret = DISP_E_UNKNOWNNAME;
218static HRESULT STDMETHODCALLTYPE disp_invokeex(
226 IServiceProvider *pspCaller)
232 HRESULT
ret = DISP_E_MEMBERNOTFOUND;
244 for (i = 0; i < pdp->cArgs; i++) {
247 arg = &pdp->rgvarg[ pdp->cArgs - 1 - i];
249 trace(
"alloc zval for arg %u VT=%08x\n", i, V_VT(
arg));
255 trace(
"arguments processed, prepare to do some work\n");
260 if (wFlags & DISPATCH_PROPERTYGET) {
262 }
else if (wFlags & DISPATCH_PROPERTYPUT) {
264 }
else if (wFlags & DISPATCH_METHOD) {
268 retval, pdp->cArgs, params)) {
270 trace(
"function called ok\n");
273 for (i = 0; i < pdp->cArgs; i++) {
275 VARIANT *srcvar = &obj->
v;
276 VARIANT *dstvar = &pdp->rgvarg[ pdp->cArgs - 1 - i];
278 trace(
"percolate modified value for arg %u VT=%08x\n", i, V_VT(dstvar));
283 trace(
"failed to call func\n");
284 ret = DISP_E_EXCEPTION;
287 trace(
"something blew up\n");
288 ret = DISP_E_EXCEPTION;
291 trace(
"Don't know how to handle this invocation %08x\n", wFlags);
296 for (i = 0; i < pdp->cArgs; i++) {
305 VariantInit(pvarRes);
309 }
else if (pvarRes) {
310 VariantInit(pvarRes);
314 trace(
"InvokeEx: I don't support DISPID=%ld\n",
id);
320static HRESULT STDMETHODCALLTYPE disp_deletememberbyname(
332static HRESULT STDMETHODCALLTYPE disp_deletememberbydispid(
343static HRESULT STDMETHODCALLTYPE disp_getmemberproperties(
351 return DISP_E_UNKNOWNNAME;
354static HRESULT STDMETHODCALLTYPE disp_getmembername(
364 *pbstrName = SysAllocString(olestr);
368 return DISP_E_UNKNOWNNAME;
372static HRESULT STDMETHODCALLTYPE disp_getnextdispid(
381 while(!zend_hash_index_exists(disp->dispid_to_name,
next))
384 if (zend_hash_index_exists(disp->dispid_to_name,
next)) {
391static HRESULT STDMETHODCALLTYPE disp_getnamespaceparent(
401static struct IDispatchExVtbl php_dispatch_vtbl = {
405 disp_gettypeinfocount,
411 disp_deletememberbyname,
412 disp_deletememberbydispid,
413 disp_getmemberproperties,
416 disp_getnamespaceparent
446 name = zend_string_init(namebuf,
strlen(namebuf), 0);
448 zend_string_addref(
name);
481 name = zend_string_init(namebuf,
strlen(namebuf), 0);
483 zend_string_addref(
name);
511 trace(
"constructing a COM wrapper for PHP object %p (%s)\n",
object,
ZSTR_VAL(
Z_OBJCE_P(
object)->
name));
519 disp->
lpVtbl = &php_dispatch_vtbl;
577 return (IDispatch*)disp;
588 if (php_com_is_valid_object(
val)) {
596 IDispatch_AddRef(V_DISPATCH(&obj->
v));
597 return V_DISPATCH(&obj->
v);
603 disp = disp_constructor(
val);
604 generate_dispids(disp);
606 return (IDispatch*)disp;
PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v, int codepage)
PHP_COM_DOTNET_API zend_string * php_com_olestring_to_string(OLECHAR *olestring, int codepage)
PHP_COM_DOTNET_API OLECHAR * php_com_string_to_olestring(const char *string, size_t string_len, int codepage)
PHP_COM_DOTNET_API void php_com_variant_from_zval(VARIANT *v, zval *z, int codepage)
PHP_COM_DOTNET_API zend_result php_com_copy_variant(VARIANT *dstvar, VARIANT *srcvar)
PHP_COM_DOTNET_API IDispatch * php_com_wrapper_export(zval *val)
PHP_COM_DOTNET_API IDispatch * php_com_wrapper_export_as_sink(zval *val, GUID *sinkid, HashTable *id_to_name)
#define FETCH_DISP(methname)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
#define PHP_COM_DOTNET_API
struct _php_com_dotnet_object php_com_dotnet_object
unsigned const char * pos
CONST_VTBL struct IDispatchExVtbl * lpVtbl
HashTable * name_to_dispid
HashTable * dispid_to_name
ZEND_API zval * zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, bool silent, zval *rv)
ZEND_API void zend_update_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zval *value)
#define call_user_function(function_table, object, function_name, retval_ptr, param_count, params)
#define FREE_HASHTABLE(ht)
#define safe_emalloc(nmemb, size, offset)
#define ALLOC_HASHTABLE(ht)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API zend_result ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, const HashPosition *pos)
ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
ZEND_API zval *ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
#define HASH_KEY_NON_EXISTENT
struct _zend_string zend_string
#define Z_STRVAL_P(zval_p)
#define ZVAL_STR_COPY(z, s)
struct _zend_array HashTable
#define Z_STRLEN_P(zval_p)
#define Z_OBJCE_P(zval_p)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)