35 char *module_name, *typelib_name =
NULL;
36 size_t module_name_len = 0, typelib_name_len = 0;
44 COAUTHIDENTITY authid = {0};
45 COAUTHINFO authinfo = {
46 RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL,
47 RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE,
73 }
else if (server_params) {
79 "Server",
sizeof(
"Server")-1))) {
80 server_name = zval_get_string(tmp);
85 "Username",
sizeof(
"Username")-1))) {
86 user_name = zval_get_string(tmp);
90 "Password",
sizeof(
"Password")-1))) {
91 password = zval_get_string(tmp);
95 "Domain",
sizeof(
"Domain")-1))) {
96 domain_name = zval_get_string(tmp);
100 "Flags",
sizeof(
"Flags")-1))) {
101 ctx = (CLSCTX)zval_get_long(tmp);
115 info.dwReserved1 = 0;
116 info.dwReserved2 = 0;
120 authid.User = (OLECHAR*)
ZSTR_VAL(user_name);
121 authid.UserLength = (ULONG)
ZSTR_LEN(user_name);
124 authid.Password = (OLECHAR*)
ZSTR_VAL(password);
125 authid.PasswordLength = (ULONG)
ZSTR_LEN(password);
127 authid.Password = (OLECHAR*)
"";
128 authid.PasswordLength = 0;
132 authid.Domain = (OLECHAR*)
ZSTR_VAL(domain_name);
133 authid.DomainLength = (ULONG)
ZSTR_LEN(domain_name);
135 authid.Domain = (OLECHAR*)
"";
136 authid.DomainLength = 0;
138 authid.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
139 info.pAuthInfo = &authinfo;
141 info.pAuthInfo =
NULL;
145 if (FAILED(CLSIDFromString(moniker, &clsid))) {
147 IBindCtx *pBindCtx =
NULL;
148 IMoniker *pMoniker =
NULL;
150 BIND_OPTS2 bopt = {0};
152 if (SUCCEEDED(
res = CreateBindCtx(0, &pBindCtx))) {
159 bopt.cbStruct =
sizeof(bopt);
160 IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS*)&bopt);
161 bopt.pServerInfo = &info;
167 bopt.cbStruct =
sizeof(bopt);
168 IBindCtx_SetBindOptions(pBindCtx, (BIND_OPTS*)&bopt);
171 if (SUCCEEDED(
res = MkParseDisplayName(pBindCtx, moniker, &ulEaten, &pMoniker))) {
172 res = IMoniker_BindToObject(pMoniker, pBindCtx,
173 NULL, &IID_IDispatch, (LPVOID*)&V_DISPATCH(&obj->
v));
175 if (SUCCEEDED(
res)) {
179 IMoniker_Release(pMoniker);
183 IBindCtx_Release(pBindCtx);
185 }
else if (server_name) {
188 qi.pIID = &IID_IDispatch;
192 res = CoCreateInstanceEx(&clsid,
NULL, ctx, &info, 1, &qi);
194 if (SUCCEEDED(
res)) {
196 V_DISPATCH(&obj->
v) = (IDispatch*)qi.pItf;
201 if (SUCCEEDED(
res)) {
207 if (info.pwszName)
efree(info.pwszName);
208 if (server_params) zend_string_release(server_name);
210 if (user_name) zend_string_release(user_name);
211 if (password) zend_string_release(password);
212 if (domain_name) zend_string_release(domain_name);
220 spprintf(&
msg, 0,
"Failed to create COM object `%s': %s", module_name, werr);
231 if (FAILED(IDispatch_GetTypeInfo(V_DISPATCH(&obj->
v), 0, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), &obj->
typeinfo)) && typelib_name) {
242 ITypeLib_GetTypeInfo(TL, 0, &obj->
typeinfo);
243 ITypeLib_Release(TL);
248 if (SUCCEEDED(ITypeInfo_GetContainingTypeLib(obj->
typeinfo, &TL, &idx))) {
252 if (SUCCEEDED(ITypeLib_GetDocumentation(TL, -1, &
name,
NULL,
NULL,
NULL))) {
267 ITypeLib_Release(TL);
279 size_t module_name_len;
281 bool code_page_is_null = 1;
282 IUnknown *unk =
NULL;
283 IDispatch *obj =
NULL;
285 OLECHAR *module =
NULL;
289 &module_name, &module_name_len, &
code_page, &code_page_is_null)) {
293 if (code_page_is_null) {
297 module = php_com_string_to_olestring(module_name, module_name_len, (int)code_page);
299 res = CLSIDFromString(module, &clsid);
304 res = GetActiveObject(&clsid,
NULL, &unk);
309 res = IUnknown_QueryInterface(unk, &IID_IDispatch, &obj);
321 IDispatch_Release(obj);
324 IUnknown_Release(obj);
333 WORD flags, DISPPARAMS *disp_params, VARIANT *
v,
bool silent,
bool allow_noarg)
336 unsigned int arg_err;
339 hr = IDispatch_Invoke(V_DISPATCH(&obj->
v), id_member,
340 &IID_NULL, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
flags, disp_params,
v, &e, &arg_err);
342 if (!silent && FAILED(hr)) {
346 case DISP_E_EXCEPTION: {
350 SysFreeString(e.bstrSource);
352 if (e.bstrDescription) {
354 SysFreeString(e.bstrDescription);
356 if (
PG(html_errors)) {
357 spprintf(&
msg, 0,
"<b>Source:</b> %s<br/><b>Description:</b> %s",
358 source ?
ZSTR_VAL(source) :
"Unknown",
359 desc_str ?
ZSTR_VAL(desc_str) :
"Unknown");
362 source ?
ZSTR_VAL(source) :
"Unknown",
363 desc_str ?
ZSTR_VAL(desc_str) :
"Unknown");
371 if (e.bstrHelpFile) {
372 SysFreeString(e.bstrHelpFile);
377 case DISP_E_TYPEMISMATCH:
383 case DISP_E_BADPARAMCOUNT:
384 if ((disp_params->cArgs + disp_params->cNamedArgs == 0) && allow_noarg) {
425 hr = ITypeInfo_GetIDsOfNames(obj->
typeinfo, &olename, 1, dispid);
428 hr = IDispatch_GetIDsOfNames(V_DISPATCH(&obj->
v), &IID_NULL, &olename, 1, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), dispid);
429 if (SUCCEEDED(hr) && hr1 != E_NOTIMPL) {
436 hr = IDispatch_GetIDsOfNames(V_DISPATCH(&obj->
v), &IID_NULL, &olename, 1, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), dispid);
459 DISPID dispid, altdispid;
460 DISPPARAMS disp_params;
462 VARIANT *vargs =
NULL, *byref_vals =
NULL;
463 int i, byref_count = 0,
j;
484 vargs = (VARIANT*)
safe_emalloc(
sizeof(VARIANT), nargs, 0);
488 for (i = 0; i < nargs; i++) {
496 byref_vals = (VARIANT*)
safe_emalloc(
sizeof(VARIANT), byref_count, 0);
497 for (
j = 0, i = 0; i < nargs; i++) {
505 memcpy(&vargs[i], &byref_vals[
j],
sizeof(vargs[i]));
506 VariantInit(&byref_vals[
j]);
508 VariantInit(&vargs[i]);
509 V_VT(&vargs[i]) = V_VT(&byref_vals[
j]) |
VT_BYREF;
511 vargs[i].byref = &V_UINT(&byref_vals[
j]);
521 for (i = 0; i < nargs; i++) {
526 disp_params.cArgs = nargs;
527 disp_params.cNamedArgs = 0;
528 disp_params.rgvarg = vargs;
529 disp_params.rgdispidNamedArgs =
NULL;
531 if (
flags & DISPATCH_PROPERTYPUT) {
532 altdispid = DISPID_PROPERTYPUT;
533 disp_params.rgdispidNamedArgs = &altdispid;
534 disp_params.cNamedArgs = 1;
543 for (i = 0,
j = 0; i < nargs; i++) {
556 if (vargs[i].byref == &V_UINT(&byref_vals[
j])) {
565 VariantClear(&byref_vals[
j]);
568 VariantClear(&vargs[i]);
571 for (i = 0,
j = 0; i < nargs; i++) {
572 VariantClear(&vargs[i]);
576 if (byref_vals)
efree(byref_vals);
588 DISPPARAMS disp_params;
590 VARIANT *vargs =
NULL;
594 vargs = (VARIANT*)
safe_emalloc(
sizeof(VARIANT), nargs, 0);
598 for (i = 0; i < nargs; i++) {
602 disp_params.cArgs = nargs;
603 disp_params.cNamedArgs = 0;
604 disp_params.rgvarg = vargs;
605 disp_params.rgdispidNamedArgs =
NULL;
607 if (
flags & DISPATCH_PROPERTYPUT) {
608 altdispid = DISPID_PROPERTYPUT;
609 disp_params.rgdispidNamedArgs = &altdispid;
610 disp_params.cNamedArgs = 1;
618 for (i = 0; i < nargs; i++) {
619 VariantClear(&vargs[i]);
625 if (hr == DISP_E_BADPARAMCOUNT)
656 OLECHAR *guid_string;
663 if (CoCreateGuid(&
retval) == S_OK && StringFromCLSID(&
retval, &guid_string) == S_OK) {
666 CoTaskMemFree(guid_string);
682 ITypeInfo *typeinfo =
NULL;
704 }
else if (sink_str) {
705 dispatch_name = sink_str;
730 ITypeInfo_Release(typeinfo);
742 bool want_sink =
false;
761 ITypeInfo_Release(typeinfo);
783 if (
result == WAIT_OBJECT_0) {
784 while (PeekMessage(&
msg,
NULL, 0, 0, PM_REMOVE)) {
785 TranslateMessage(&
msg);
786 DispatchMessage(&
msg);
802 ITypeLib *pTL =
NULL;
811 php_error_docref(
NULL,
E_WARNING,
"com_load_typelib(): Argument #2 ($case_insensitive) is ignored since declaration of case-insensitive constants is no longer supported");
823 ITypeLib_Release(pTL);
PW32CP const struct php_win32_cp * php_win32_cp_get_by_id(DWORD id)
zend_result php_com_do_invoke(php_com_dotnet_object *obj, zend_string *name, WORD flags, VARIANT *v, int nargs, zval *args, bool allow_noarg)
zend_result php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, WORD flags, VARIANT *v, int nargs, zval *args, bool silent, bool allow_noarg)
HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, zend_string *name, DISPID *dispid)
HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, WORD flags, DISPPARAMS *disp_params, VARIANT *v, bool silent, bool allow_noarg)
zend_result php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, WORD flags, VARIANT *v, int nargs, zval *args)
zend_class_entry * php_com_variant_class_entry
com_message_pump(int $timeout_milliseconds=0)
com_get_active_object(string $prog_id, ?int $codepage=null)
com_event_sink(variant $variant, object $sink_object, array|string|null $sink_interface=null)
com_load_typelib(string $typelib, bool $case_insensitive=true)
const DISP_E_PARAMNOTFOUND
const CLSCTX_REMOTE_SERVER
com_print_typeinfo(variant|string $variant, ?string $dispatch_interface=null, bool $display_sink=false)
void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable)
void php_com_throw_exception(HRESULT code, char *message)
PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp, 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)
ITypeLib * php_com_cache_typelib(ITypeLib *TL, char *cache_key, zend_long cache_key_len)
ITypeInfo * php_com_locate_typeinfo(zend_string *type_lib_name, php_com_dotnet_object *obj, zend_string *dispatch_name, bool sink)
PHP_COM_DOTNET_API ITypeLib * php_com_load_typelib_via_cache(const char *search_string, int codepage)
PHP_COM_DOTNET_API zend_result php_com_import_typelib(ITypeLib *TL, int mode, int codepage)
bool php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, bool printdef, GUID *guid, int codepage)
PHP_COM_DOTNET_API zend_result php_com_zval_from_variant(zval *z, VARIANT *v, int codepage)
PHP_COM_DOTNET_API void php_com_variant_from_zval(VARIANT *v, zval *z, int codepage)
PHP_COM_DOTNET_API IDispatch * php_com_wrapper_export_as_sink(zval *val, GUID *sinkid, HashTable *id_to_name)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
PHPAPI void php_com_initialize(void)
struct _php_com_dotnet_object php_com_dotnet_object
HashTable * id_of_name_cache
IDispatch * sink_dispatch
zend_string * function_name
zend_internal_arg_info * arg_info
PHP_WINUTIL_API char * php_win32_error_to_msg(HRESULT error)
PHP_WINUTIL_API void php_win32_error_msg_free(char *msg)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
#define Z_PARAM_ARRAY_HT_OR_STR_OR_NULL(dest_ht, dest_str)
#define Z_PARAM_OBJ_OF_CLASS_OR_STR(destination_object, base_ce, destination_string)
#define ZEND_PARSE_PARAMETERS_END()
#define Z_PARAM_OBJECT(dest)
#define Z_PARAM_STR_OR_NULL(dest)
#define zend_parse_parameters_none()
#define Z_PARAM_STRING(dest, dest_len)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
#define Z_PARAM_BOOL(dest)
#define Z_PARAM_OBJECT_OF_CLASS(dest, _ce)
#define FREE_HASHTABLE(ht)
#define safe_emalloc(nmemb, size, offset)
#define ALLOC_HASHTABLE(ht)
zend_string_release_ex(func->internal_function.function_name, 0)
#define ZEND_ARG_SEND_MODE(arg_info)
struct _zend_internal_function zend_internal_function
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
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)
struct _zend_string zend_string
struct _zend_object zend_object
struct _zend_array HashTable
ZEND_RESULT_CODE zend_result
ZEND_API void zval_ptr_dtor(zval *zval_ptr)