PocketPC-将VT_DATE转换为不变的VT_BSTR

时间:2020-03-06 14:32:58  来源:igfitidea点击:

我正在尝试将VT_DATE的VARIANT转换为不变的VT_BSTR。以下代码在Windows XP上有效:

VARIANT va;
::VariantInit(&va);

// set the variant to VT_DATE
SYSTEMTIME st;
memset(&st, 0, sizeof(SYSTEMTIME));
st.wYear = 2008;
st.wMonth = 9;
st.wDay = 22;
st.wHour = 12;
st.wMinute = 30;

DATE date;
SystemTimeToVariantTime(&st, &date);

va.vt = VT_DATE;
va.date = date;

// change to a string
err = ::VariantChangeTypeEx(&va, 
                &va, 
                LOCALE_INVARIANT, 
                0, 
                VT_BSTR);

但是在PPC 2003和Windows Mobile 5上,上面的代码返回E_FAIL。有人可以更正上面的代码或者提供替代方法吗?

编辑:将日期转换为字符串后,我正在使用字符串来执行SQL更新。我希望无论设备的区域设置如何都可以进行更新,所以这就是为什么我试图将其转换为"不变"格式。

我现在使用以下方法将日期转换为似乎可以使用的格式:

err = ::VariantTimeToSystemTime(va.date, &time);
if (FAILED(err))
    goto cleanup;

err = strDate.PrintF(_T("%04d-%02d-%02d %02d:%02d:%02d.%03d"),
    time.wYear,
    time.wMonth,
    time.wDay,
    time.wHour,
    time.wMinute,
    time.wSecond,
    time.wMilliseconds);

解决方案

这并不是一个真正的答案,但是将日期更改为字符串不是一个不依赖于语言环境的任务,它很大程度上取决于语言环境。在这种情况下,我会将"变体时间"转换为"系统时间",然后使用sprintf样式的函数将其转换为字符串

在上下文中不确定,但似乎我们走错了路。为什么不使用VarBstrFromDate?它使用一种语言环境(或者可选地忽略一个语言环境)出现,并且可能更接近于我们想要的语言环境。

(很抱歉,我花了一段时间回复("工作",我们知道...))

从COM的角度来看,我看不出代码有什么问题。

也许问题出在LOCALE_INVARIANT。它是Windows XP引入的。也许Windows CE家族不支持它?

尝试将语言环境更改为LOCALE_USER_DEFAULT,然后检查是否仍然出现错误。无论如何,大多数情况下,这将是最合适的语言环境;特别是当我们尝试向用户显示该值时。

如果由于需要将值传递到其他地方以进行解析而确实需要某种特定格式,请尝试使用符合我们要求的特定语言环境;也许是en_US。

请让我们知道如何进行。