On 02.03.2015 11:12, Shuai Meng wrote:
+ HRESULT hres;
+ BSTR bstr;
+ WCHAR ret;
+
+ TRACE("(%s)\n", debugstr_variant(arg));
+
+ switch(V_VT(arg)) {
+ case VT_NULL:
+ return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
+ case VT_EMPTY:
+ return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL);
+ case VT_BSTR:
+ bstr = V_BSTR(arg);
+ default:
+ hres = to_string(arg, &bstr);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ ret = bstr[0];
+ if(ret == 0)
+ return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL);
+ return return_short(res, ret);
Looks like you need to handle VT_NULL explicitly and after that only distinguish between VT_BSTR or the rest.
Also you're leaking memory and missing a 'break'.