@@ -102,15 +102,14 @@ static PHP_MINFO_FUNCTION(COM)
102
102
DISPLAY_INI_ENTRIES ();
103
103
}
104
104
105
- PHPAPI HRESULT php_COM_invoke (comval * obj , DISPID dispIdMember , WORD wFlags , DISPPARAMS FAR * pDispParams , VARIANT FAR * pVarResult TSRMLS_DC )
105
+ PHPAPI HRESULT php_COM_invoke (comval * obj , DISPID dispIdMember , WORD wFlags , DISPPARAMS FAR * pDispParams , VARIANT FAR * pVarResult , char * * ErrString TSRMLS_DC )
106
106
{
107
107
HRESULT hr ;
108
108
int failed = FALSE;
109
109
unsigned int ArgErr ;
110
110
EXCEPINFO ExceptInfo ;
111
111
112
- /* TODO: Make use of the ArgError when hr==E_INVALIDARG */
113
- /* TODO: Deal with the ExceptInfo structure in the error message */
112
+ * ErrString = NULL ;
114
113
if (C_ISREFD (obj ))
115
114
{
116
115
if (C_HASTLIB (obj ))
@@ -136,6 +135,33 @@ PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DIS
136
135
hr = C_DISPATCH_VT (obj )-> Invoke (C_DISPATCH (obj ), dispIdMember , & IID_NULL , LOCALE_SYSTEM_DEFAULT , wFlags , pDispParams , pVarResult , & ExceptInfo , & ArgErr );
137
136
}
138
137
138
+ if (FAILED (hr ))
139
+ {
140
+ switch (hr )
141
+ {
142
+ case DISP_E_EXCEPTION :
143
+ {
144
+ int srclen ;
145
+ char * src = php_OLECHAR_to_char (ExceptInfo .bstrSource , & srclen , 1 , codepage TSRMLS_CC );
146
+ int desclen ;
147
+ char * desc = php_OLECHAR_to_char (ExceptInfo .bstrDescription , & desclen , 1 , codepage TSRMLS_CC );
148
+ * ErrString = pemalloc (srclen + desclen + 50 , 1 );
149
+ sprintf (* ErrString , "<b>Source</b>: %s <b>Description</b>: %s" , src , desc );
150
+ pefree (src , 1 );
151
+ pefree (desc , 1 );
152
+ SysFreeString (ExceptInfo .bstrSource );
153
+ SysFreeString (ExceptInfo .bstrDescription );
154
+ SysFreeString (ExceptInfo .bstrHelpFile );
155
+ }
156
+ break ;
157
+ case DISP_E_PARAMNOTFOUND :
158
+ case DISP_E_TYPEMISMATCH :
159
+ * ErrString = pemalloc (25 , 1 );
160
+ sprintf (* ErrString , "<b>Argument</b>: %d" , pDispParams -> cArgs - ArgErr + 1 );
161
+ break ;
162
+ }
163
+ }
164
+
139
165
return hr ;
140
166
}
141
167
else
@@ -550,7 +576,7 @@ PHP_FUNCTION(com_load)
550
576
{
551
577
php_COM_destruct (obj TSRMLS_CC );
552
578
error_message = php_COM_error_message (hr TSRMLS_CC );
553
- php_error (E_WARNING ,"Invalid ProgID or Moniker: %s\n " , error_message );
579
+ php_error (E_WARNING ,"Invalid ProgID, GUID string, or Moniker: %s " , error_message );
554
580
LocalFree (error_message );
555
581
RETURN_FALSE ;
556
582
}
@@ -589,7 +615,7 @@ PHP_FUNCTION(com_load)
589
615
{
590
616
error_message = php_COM_error_message (hr TSRMLS_CC );
591
617
clsid_str = php_string_from_clsid (& clsid TSRMLS_CC );
592
- php_error (E_WARNING ,"Unable to obtain IDispatch interface for CLSID %s: %s" ,clsid_str ,error_message );
618
+ php_error (E_WARNING ,"Unable to obtain IDispatch interface for CLSID %s: %s" ,clsid_str ,error_message );
593
619
LocalFree (error_message );
594
620
efree (clsid_str );
595
621
php_COM_destruct (obj TSRMLS_CC );
@@ -673,7 +699,7 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
673
699
break ;
674
700
675
701
default :
676
- php_error (E_WARNING ,"Wrong argument count to IEnumVariant::Next()\n " );
702
+ php_error (E_WARNING ,"Wrong argument count to IEnumVariant::Next()" );
677
703
678
704
return FAILURE ;
679
705
}
@@ -696,7 +722,7 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
696
722
if (FAILED (hr = C_ENUMVARIANT_VT (obj )-> Next (C_ENUMVARIANT (obj ), count , pSA -> pvData , & count )))
697
723
{
698
724
char * error_message = php_COM_error_message (hr TSRMLS_CC );
699
- php_error (E_WARNING ,"IEnumVariant::Next() failed: %s\n " , error_message );
725
+ php_error (E_WARNING ,"IEnumVariant::Next() failed: %s " , error_message );
700
726
efree (error_message );
701
727
VariantClear (var_result );
702
728
return FAILURE ;
@@ -708,7 +734,7 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
708
734
if (FAILED (SafeArrayRedim (pSA , rgsabound )))
709
735
{
710
736
char * error_message = php_COM_error_message (hr TSRMLS_CC );
711
- php_error (E_WARNING ,"IEnumVariant::Next() failed: %s\n " , error_message );
737
+ php_error (E_WARNING ,"IEnumVariant::Next() failed: %s " , error_message );
712
738
efree (error_message );
713
739
VariantClear (var_result );
714
740
return FAILURE ;
@@ -722,7 +748,7 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
722
748
if (FAILED (hr = C_ENUMVARIANT_VT (obj )-> Reset (C_ENUMVARIANT (obj ))))
723
749
{
724
750
char * error_message = php_COM_error_message (hr TSRMLS_CC );
725
- php_error (E_WARNING ,"IEnumVariant::Next() failed: %s\n " , error_message );
751
+ php_error (E_WARNING ,"IEnumVariant::Next() failed: %s " , error_message );
726
752
efree (error_message );
727
753
return FAILURE ;
728
754
}
@@ -744,13 +770,13 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
744
770
break ;
745
771
746
772
default :
747
- php_error (E_WARNING ,"Wrong argument count to IEnumVariant::Skip()\n " );
773
+ php_error (E_WARNING ,"Wrong argument count to IEnumVariant::Skip()" );
748
774
return FAILURE ;
749
775
}
750
776
if (FAILED (hr = C_ENUMVARIANT_VT (obj )-> Skip (C_ENUMVARIANT (obj ), count )))
751
777
{
752
778
char * error_message = php_COM_error_message (hr TSRMLS_CC );
753
- php_error (E_WARNING ,"IEnumVariant::Next() failed: %s\n " , error_message );
779
+ php_error (E_WARNING ,"IEnumVariant::Next() failed: %s " , error_message );
754
780
efree (error_message );
755
781
return FAILURE ;
756
782
}
@@ -759,14 +785,16 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
759
785
}
760
786
else
761
787
{
788
+ char * ErrString ;
789
+
762
790
funcname = php_char_to_OLECHAR (Z_STRVAL_P (function_name ), Z_STRLEN_P (function_name ), codepage TSRMLS_CC );
763
791
764
792
hr = php_COM_get_ids_of_names (obj , & funcname , & dispid TSRMLS_CC );
765
793
766
794
if (FAILED (hr ))
767
795
{
768
796
error_message = php_COM_error_message (hr TSRMLS_CC );
769
- php_error (E_WARNING ,"Unable to lookup %s: %s\n " , Z_STRVAL_P (function_name ), error_message );
797
+ php_error (E_WARNING ,"Unable to lookup %s: %s " , Z_STRVAL_P (function_name ), error_message );
770
798
LocalFree (error_message );
771
799
efree (funcname );
772
800
return FAILURE ;
@@ -785,7 +813,7 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
785
813
dispparams .cArgs = arg_count ;
786
814
dispparams .cNamedArgs = 0 ;
787
815
788
- hr = php_COM_invoke (obj , dispid , DISPATCH_METHOD |DISPATCH_PROPERTYGET , & dispparams , var_result TSRMLS_CC );
816
+ hr = php_COM_invoke (obj , dispid , DISPATCH_METHOD |DISPATCH_PROPERTYGET , & dispparams , var_result , & ErrString TSRMLS_CC );
789
817
790
818
efree (funcname );
791
819
for (current_arg = 0 ;current_arg < arg_count ;current_arg ++ )
@@ -797,7 +825,15 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
797
825
if (FAILED (hr ))
798
826
{
799
827
error_message = php_COM_error_message (hr TSRMLS_CC );
800
- php_error (E_WARNING ,"Invoke() failed: %s\n" , error_message );
828
+ if (ErrString )
829
+ {
830
+ php_error (E_WARNING ,"Invoke() failed: %s %s" , error_message , ErrString );
831
+ pefree (ErrString , 1 );
832
+ }
833
+ else
834
+ {
835
+ php_error (E_WARNING ,"Invoke() failed: %s" , error_message );
836
+ }
801
837
LocalFree (error_message );
802
838
return FAILURE ;
803
839
}
@@ -945,7 +981,7 @@ static int do_COM_propget(VARIANT *var_result, comval *obj, pval *arg_property,
945
981
OLECHAR * propname ;
946
982
char * error_message ;
947
983
DISPPARAMS dispparams ;
948
-
984
+ char * ErrString ;
949
985
950
986
/* obtain property handler */
951
987
propname = php_char_to_OLECHAR (Z_STRVAL_P (arg_property ), Z_STRLEN_P (arg_property ), codepage TSRMLS_CC );
@@ -955,7 +991,7 @@ static int do_COM_propget(VARIANT *var_result, comval *obj, pval *arg_property,
955
991
if (FAILED (hr ))
956
992
{
957
993
error_message = php_COM_error_message (hr TSRMLS_CC );
958
- php_error (E_WARNING ,"Unable to lookup %s: %s\n " , Z_STRVAL_P (arg_property ), error_message );
994
+ php_error (E_WARNING ,"Unable to lookup %s: %s " , Z_STRVAL_P (arg_property ), error_message );
959
995
LocalFree (error_message );
960
996
efree (propname );
961
997
if (cleanup )
@@ -968,12 +1004,20 @@ static int do_COM_propget(VARIANT *var_result, comval *obj, pval *arg_property,
968
1004
dispparams .cArgs = 0 ;
969
1005
dispparams .cNamedArgs = 0 ;
970
1006
971
- hr = php_COM_invoke (obj , dispid , DISPATCH_PROPERTYGET , & dispparams , var_result TSRMLS_CC );
1007
+ hr = php_COM_invoke (obj , dispid , DISPATCH_PROPERTYGET , & dispparams , var_result , & ErrString TSRMLS_CC );
972
1008
973
1009
if (FAILED (hr ))
974
1010
{
975
1011
error_message = php_COM_error_message (hr TSRMLS_CC );
976
- php_error (E_WARNING ,"PropGet() failed: %s\n" , error_message );
1012
+ if (ErrString )
1013
+ {
1014
+ php_error (E_WARNING ,"PropGet() failed: %s %s" , error_message , ErrString );
1015
+ pefree (ErrString , 1 );
1016
+ }
1017
+ else
1018
+ {
1019
+ php_error (E_WARNING ,"PropGet() failed: %s" , error_message );
1020
+ }
977
1021
LocalFree (error_message );
978
1022
efree (propname );
979
1023
if (cleanup )
@@ -1001,6 +1045,7 @@ static void do_COM_propput(pval *return_value, comval *obj, pval *arg_property,
1001
1045
VARIANT * var_result , * new_value ;
1002
1046
DISPPARAMS dispparams ;
1003
1047
DISPID mydispid = DISPID_PROPERTYPUT ;
1048
+ char * ErrString ;
1004
1049
1005
1050
ALLOC_VARIANT (var_result );
1006
1051
ALLOC_VARIANT (new_value );
@@ -1013,7 +1058,7 @@ static void do_COM_propput(pval *return_value, comval *obj, pval *arg_property,
1013
1058
if (FAILED (hr ))
1014
1059
{
1015
1060
error_message = php_COM_error_message (hr TSRMLS_CC );
1016
- php_error (E_WARNING ,"Unable to lookup %s: %s\n " , Z_STRVAL_P (arg_property ), error_message );
1061
+ php_error (E_WARNING ,"Unable to lookup %s: %s " , Z_STRVAL_P (arg_property ), error_message );
1017
1062
LocalFree (error_message );
1018
1063
efree (propname );
1019
1064
@@ -1029,12 +1074,20 @@ static void do_COM_propput(pval *return_value, comval *obj, pval *arg_property,
1029
1074
dispparams .cArgs = 1 ;
1030
1075
dispparams .cNamedArgs = 1 ;
1031
1076
1032
- hr = php_COM_invoke (obj , dispid , DISPATCH_PROPERTYPUT , & dispparams , NULL TSRMLS_CC );
1077
+ hr = php_COM_invoke (obj , dispid , DISPATCH_PROPERTYPUT , & dispparams , NULL , & ErrString TSRMLS_CC );
1033
1078
1034
1079
if (FAILED (hr ))
1035
1080
{
1036
1081
error_message = php_COM_error_message (hr TSRMLS_CC );
1037
- php_error (E_WARNING ,"PropPut() failed: %s\n" , error_message );
1082
+ if (ErrString )
1083
+ {
1084
+ php_error (E_WARNING ,"PropPut() failed: %s %s" , error_message , ErrString );
1085
+ pefree (ErrString , 1 );
1086
+ }
1087
+ else
1088
+ {
1089
+ php_error (E_WARNING ,"PropPut() failed: %s" , error_message );
1090
+ }
1038
1091
LocalFree (error_message );
1039
1092
efree (propname );
1040
1093
@@ -1047,7 +1100,7 @@ static void do_COM_propput(pval *return_value, comval *obj, pval *arg_property,
1047
1100
dispparams .cArgs = 0 ;
1048
1101
dispparams .cNamedArgs = 0 ;
1049
1102
1050
- hr = php_COM_invoke (obj , dispid , DISPATCH_PROPERTYGET , & dispparams , var_result TSRMLS_CC );
1103
+ hr = php_COM_invoke (obj , dispid , DISPATCH_PROPERTYGET , & dispparams , var_result , & ErrString TSRMLS_CC );
1051
1104
1052
1105
if (SUCCEEDED (hr ))
1053
1106
{
@@ -1059,6 +1112,11 @@ static void do_COM_propput(pval *return_value, comval *obj, pval *arg_property,
1059
1112
zval_copy_ctor (return_value );
1060
1113
}
1061
1114
1115
+ if (ErrString )
1116
+ {
1117
+ pefree (ErrString , 1 );
1118
+ }
1119
+
1062
1120
FREE_VARIANT (var_result );
1063
1121
FREE_VARIANT (new_value );
1064
1122
0 commit comments