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'.