30static void safe_array_from_zval(VARIANT *
v,
zval *z,
int codepage)
51 }
else if (intindex > UINT_MAX) {
59 bound.cElements = zend_hash_num_elements(
Z_ARRVAL_P(z));
63 SafeArrayAccessData(sa, &va);
64 va = (VARIANT*)sa->pvData;
73 if (intindex < bound.cElements) {
79 SafeArrayUnaccessData(sa);
96static void php_com_variant_from_zval_ex(VARIANT *
v,
zval *z,
int codepage, VARTYPE
vt)
113 V_BOOL(
v) = VARIANT_FALSE;
118 V_BOOL(
v) = VARIANT_TRUE;
122 if (php_com_is_valid_object(z)) {
127 if (V_DISPATCH(&obj->
v)) {
128 IDispatch_AddRef(V_DISPATCH(&obj->
v));
130 V_DISPATCH(
v) = V_DISPATCH(&obj->
v);
134 V_VARIANTREF(
v) = &obj->
v;
145 safe_array_from_zval(
v, z, codepage);
154#if SIZEOF_ZEND_LONG == 4
183 php_com_variant_from_zval_ex(
v, z, codepage,
VT_EMPTY);
188 OLECHAR *olestring =
NULL;
215#if SIZEOF_ZEND_LONG == 8
239 olestring = V_BSTR(
v);
247 if (V_UNKNOWN(
v) !=
NULL) {
250 if (SUCCEEDED(IUnknown_QueryInterface(V_UNKNOWN(
v), &IID_IDispatch, &disp))) {
252 IDispatch_Release(disp);
260 if (V_DISPATCH(
v) !=
NULL) {
298 *V_UI1REF(dstvar) = V_UI1(srcvar);
300 V_UI1(dstvar) = V_UI1(srcvar);
306 *V_I1REF(dstvar) = V_I1(srcvar);
308 V_I1(dstvar) = V_I1(srcvar);
314 *V_UI2REF(dstvar) = V_UI2(srcvar);
316 V_UI2(dstvar) = V_UI2(srcvar);
322 *V_I2REF(dstvar) = V_I2(srcvar);
324 V_I2(dstvar) = V_I2(srcvar);
330 *V_UI4REF(dstvar) = V_UI4(srcvar);
332 V_UI4(dstvar) = V_UI4(srcvar);
338 *V_I4REF(dstvar) = V_I4(srcvar);
340 V_I4(dstvar) = V_I4(srcvar);
343#if SIZEOF_ZEND_LONG == 8
346 *V_UI8REF(dstvar) = V_UI8(srcvar);
348 V_UI8(dstvar) = V_UI8(srcvar);
354 *V_I8REF(dstvar) = V_I8(srcvar);
356 V_I8(dstvar) = V_I8(srcvar);
362 *V_INTREF(dstvar) = V_INT(srcvar);
364 V_INT(dstvar) = V_INT(srcvar);
370 *V_UINTREF(dstvar) = V_UINT(srcvar);
372 V_UINT(dstvar) = V_UINT(srcvar);
378 *V_R4REF(dstvar) = V_R4(srcvar);
380 V_R4(dstvar) = V_R4(srcvar);
386 *V_R8REF(dstvar) = V_R8(srcvar);
388 V_R8(dstvar) = V_R8(srcvar);
394 *V_BOOLREF(dstvar) = V_BOOL(srcvar);
396 V_BOOL(dstvar) = V_BOOL(srcvar);
402 *V_BSTRREF(dstvar) = V_BSTR(srcvar);
404 V_BSTR(dstvar) = V_BSTR(srcvar);
410 *V_UNKNOWNREF(dstvar) = V_UNKNOWN(srcvar);
412 V_UNKNOWN(dstvar) = V_UNKNOWN(srcvar);
418 *V_DISPATCHREF(dstvar) = V_DISPATCH(srcvar);
420 V_DISPATCH(dstvar) = V_DISPATCH(srcvar);
450 "z!|ll", &zvalue, &
vt, &codepage)) {
462 php_com_variant_from_zval_ex(&obj->
v, zvalue, obj->
code_page,
vt);
483 res = VariantChangeType(&obj->
v, &obj->
v, 0, (VARTYPE)
vt);
489 spprintf(&
msg, 0,
"Variant type conversion failed: %s", werr);
529 VariantClear(&obj->
v);
550 VARIANT left_val, right_val;
551 VARIANT *vleft =
NULL, *vright =
NULL;
557 VariantInit(&left_val);
558 VariantInit(&right_val);
582 "z!z!", &zleft, &zright)) {
596 result = VarAdd(vleft, vright, &vres);
599 result = VarCat(vleft, vright, &vres);
602 result = VarSub(vleft, vright, &vres);
605 result = VarMul(vleft, vright, &vres);
608 result = VarAnd(vleft, vright, &vres);
611 result = VarDiv(vleft, vright, &vres);
614 result = VarEqv(vleft, vright, &vres);
617 result = VarIdiv(vleft, vright, &vres);
620 result = VarImp(vleft, vright, &vres);
623 result = VarMod(vleft, vright, &vres);
626 result = VarOr(vleft, vright, &vres);
629 result = VarPow(vleft, vright, &vres);
632 result = VarXor(vleft, vright, &vres);
646 VariantClear(&left_val);
647 VariantClear(&right_val);
746 VARIANT *vleft =
NULL;
752 VariantInit(&left_val);
769 result = VarAbs(vleft, &vres);
772 result = VarFix(vleft, &vres);
775 result = VarInt(vleft, &vres);
778 result = VarNeg(vleft, &vres);
781 result = VarNot(vleft, &vres);
794 VariantClear(&left_val);
838 VARIANT *vleft =
NULL;
844 VariantInit(&left_val);
852 "z!l", &zleft, &decimals)) {
859 if (SUCCEEDED(VarRound(vleft, (
int)decimals, &vres))) {
864 VariantClear(&left_val);
871 VARIANT left_val, right_val;
872 VARIANT *vleft =
NULL, *vright =
NULL;
879 STDAPI VarCmp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid,
DWORD flags);
881 VariantInit(&left_val);
882 VariantInit(&right_val);
893 &zright, &lcid, &
flags)) {
906 "z!z!|ll", &zleft, &zright, &lcid, &
flags)) {
920 VariantClear(&left_val);
921 VariantClear(&right_val);
940 if (SUCCEEDED(VariantChangeType(&vres, &obj->
v, 0,
VT_DATE))) {
944 VariantTimeToSystemTime(V_DATE(&vres), &systime);
946 memset(&tmv, 0,
sizeof(tmv));
947 tmv.tm_year = systime.wYear - 1900;
948 tmv.tm_mon = systime.wMonth - 1;
949 tmv.tm_mday = systime.wDay;
950 tmv.tm_hour = systime.wHour;
951 tmv.tm_min = systime.wMinute;
952 tmv.tm_sec = systime.wSecond;
993 memset(&systime, 0,
sizeof(systime));
995 systime.wDay = tmv->tm_mday;
996 systime.wHour = tmv->tm_hour;
997 systime.wMinute = tmv->tm_min;
998 systime.wMonth = tmv->tm_mon + 1;
999 systime.wSecond = tmv->tm_sec;
1000 systime.wYear = tmv->tm_year + 1900;
1003 SystemTimeToVariantTime(&systime, &V_DATE(&
res));
1044 V_VT(&vtmp) =
VT_I4;
1045 V_I4(&vtmp) = V_ERROR(&obj->
v);
1047 res = VariantChangeType(&obj->
v, V_VT(&obj->
v) !=
VT_ERROR ? &obj->
v : &vtmp, 0, (VARTYPE)
vt);
1049 if (SUCCEEDED(
res)) {
1058 spprintf(&
msg, 0,
"Variant type conversion failed: %s", werr);
1084 V_VT(&vres) =
VT_I4;
1085 V_I4(&vres) = V_ERROR(&obj->
v);
1087 res = VariantChangeType(&vres, V_VT(&vres) ==
VT_EMPTY ? &obj->
v : &vres, 0, (VARTYPE)
vt);
1089 if (SUCCEEDED(
res)) {
1095 spprintf(&
msg, 0,
"Variant type conversion failed: %s", werr);
1102 VariantClear(&vres);
zend_class_entry * php_com_variant_class_entry
variant_imp(mixed $left, mixed $right)
variant_and(mixed $left, mixed $right)
variant_or(mixed $left, mixed $right)
variant_neg(mixed $value)
variant_eqv(mixed $left, mixed $right)
variant_abs(mixed $value)
variant_get_type(variant $variant)
variant_cmp(mixed $left, mixed $right, int $locale_id=LOCALE_SYSTEM_DEFAULT, int $flags=0)
variant_idiv(mixed $left, mixed $right)
variant_mul(mixed $left, mixed $right)
variant_set(variant $variant, mixed $value)
variant_date_from_timestamp(int $timestamp)
variant_mod(mixed $left, mixed $right)
variant_set_type(variant $variant, int $type)
variant_xor(mixed $left, mixed $right)
variant_int(mixed $value)
variant_fix(mixed $value)
const LOCALE_SYSTEM_DEFAULT
variant_sub(mixed $left, mixed $right)
variant_pow(mixed $left, mixed $right)
variant_round(mixed $value, int $decimals)
variant_cat(mixed $left, mixed $right)
variant_add(mixed $left, mixed $right)
variant_date_to_timestamp(variant $variant)
variant_div(mixed $left, mixed $right)
variant_not(mixed $value)
variant_cast(variant $variant, int $type)
void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable)
PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v, int codepage)
void php_com_throw_exception(HRESULT code, char *message)
PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp, int codepage)
zend_string * php_com_bstr_to_string(BSTR bstr, int codepage)
BSTR php_com_string_to_bstr(zend_string *string, 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 zend_result php_com_copy_variant(VARIANT *dstvar, VARIANT *srcvar)
PHP_COM_DOTNET_API IDispatch * php_com_wrapper_export(zval *val)
memset(ptr, 0, type->size)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
PHPAPI void php_com_initialize(void)
#define PHP_COM_DOTNET_API
struct _php_com_dotnet_object php_com_dotnet_object
mktime(int $hour, ?int $minute=null, ?int $second=null, ?int $month=null, ?int $day=null, ?int $year=null)
localtime(?int $timestamp=null, bool $associative=false)
unsigned const char * pos
IDispatch * sink_dispatch
PHP_WINUTIL_API char * php_win32_error_to_msg(HRESULT error)
PHP_WINUTIL_API void php_win32_error_msg_free(char *msg)
#define INTERNAL_FUNCTION_PARAMETERS
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API zend_result zend_parse_parameters_ex(int flags, uint32_t num_args, const char *type_spec,...)
#define ZEND_PARSE_PARAMS_QUIET
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)
#define HASH_KEY_NON_EXISTENT
#define HASH_KEY_IS_STRING
struct _zend_string zend_string
#define Z_ARRVAL_P(zval_p)
#define ZVAL_DOUBLE(z, d)
ZEND_RESULT_CODE zend_result