Windows mobile PocketPC-将VT_日期转换为不变VT_BSTR

Windows mobile PocketPC-将VT_日期转换为不变VT_BSTR,windows-mobile,culture,pocketpc,Windows Mobile,Culture,Pocketpc,我正在尝试将VT_DATE的变体转换为不变量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;

我正在尝试将VT_DATE的变体转换为不变量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风格的函数将其转换为字符串,在您的上下文中不确定,但似乎您走错了方向。为什么不使用?这将使用一个区域设置(或者可以选择忽略一个区域设置),并且可能与您想要的更接近。

(很抱歉,我花了一段时间才回复('work',您知道…)

从COM的角度来看,我认为代码没有任何问题

也许问题出在语言环境_不变量上。它是在Windows XP中引入的;也许Windows CE系列不支持它

尝试将区域设置更改为locale\u USER\u DEFAULT,然后检查是否仍然出现错误。大多数情况下,无论如何,这将是最合适的场所;尤其是当您试图向用户显示该值时

如果您确实需要特定的格式,因为您需要将值传递到其他地方进行解析,请尝试使用符合您的要求的特定区域设置;也许是我们


请告诉我们进展如何。

我以为我知道,但我错了。实际上,您可以对源和目标使用相同的变量。您可以添加关于如何将变量设置为VT_日期的更多详细信息吗?我更改了示例以说明如何设置VT_日期,并使用相同的E_失败结果。VarBstrFromDate失败,就像使用LOCALE_不变量(0x007f)时VariantChangeTypex一样。不幸的是,转换为用户的LOCALE正是我不想做的。请参阅原始帖子中的编辑。我正在使用类似的代码将浮点数转换为其字符串表示形式,在这种情况下,LOCALE_不变量可以工作。