PocketPC - конвертировать VT_DATE в инвариант VT_BSTR - PullRequest
0 голосов
/ 22 сентября 2008

Я пытаюсь преобразовать VARIANT из 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);

Ответы [ 3 ]

1 голос
/ 23 сентября 2008

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

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

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

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

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

Пожалуйста, дайте нам знать, как это происходит.

1 голос
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

...