2008-09-22 5 views
0

Я пытаюсь преобразовать VARIANT из VT_DATE в инвариант VT_BSTR. Следующий код работает на Windows XP:PocketPC - преобразовать VT_DATE в инвариант VT_BSTR

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. Может кто-то исправить вышеуказанный код или предоставить альтернативу?

EDIT: После преобразования даты в строку, я использую строку для выполнения 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); 
+0

Я думал, что знаю, но я ошибся. Фактически вам разрешено использовать тот же VARIANT для источника и назначения. Можете ли вы добавить дополнительные сведения о том, как VARIANT устанавливается в VT_DATE? – 2008-09-22 16:44:23

+0

Я изменил пример, чтобы проиллюстрировать настройку VT_DATE с тем же результатом E_FAIL. – 2008-09-22 17:56:27

ответ

1

Это не совсем ответ, но изменение даты в строку не локально-инвариантная задача - она ​​сильно зависит от локали. В этом случае я бы преобразовал время Variant Time в System Time, а затем использовал функцию стиля sprintf, чтобы преобразовать ее в строку

0

Не определен в вашем контексте здесь, но, похоже, вы ошибаетесь , Почему бы не использовать VarBstrFromDate? Это позволяет использовать локаль (или, возможно, игнорировать ее) и, вероятно, намного ближе к тому, что вы хотите.

+0

Ошибка VarBstrFromDate, так же как и VariantChangeTypeEx при использовании LOCALE_INVARIANT (0x007f) – 2008-09-26 18:39:27

1

(Я сожалею, что мне потребовалось некоторое время, чтобы ответить («работу», вы знаете ...))

Я не вижу ничего плохого с кодом, с COM точки Посмотреть.

Возможно, проблема связана с LOCALE_INVARIANT. Он был представлен с Windows XP; возможно, он не поддерживается в семействе Windows CE?

Попробуйте изменить локаль на LOCALE_USER_DEFAULT и проверьте, все еще есть ошибка. В большинстве случаев это будет наиболее подходящий язык в любом случае; особенно если вы пытаетесь отобразить значение для пользователя.

Если вам действительно нужен конкретный формат, потому что вам нужно передать значение в другом месте, которое будет его анализировать, попробуйте использовать определенный язык, соответствующий вашим требованиям; возможно, en_US.

Пожалуйста, сообщите нам, как это будет.

Смежные вопросы