Создать вариант из FILETIME - PullRequest
       38

Создать вариант из FILETIME

2 голосов
/ 29 марта 2012

Я хочу создать VARIANT или _variant_t из FILETIME в c / c ++.
По сути, это то, что я хочу:

FILETIME ft;  
//Populate ft  
VARIANT vFt;  
VariantInit(&vFt);  
vFt.vt = VT_FILETIME;  

Теперь, как мне установить ft внутри vFt?

Может кто-нибудь помочь мне с этим?

Спасибо, Саурабх

Ответы [ 3 ]

1 голос
/ 08 мая 2014

Использовать InitVariantFromFileTime

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762323(v=vs.85).aspx

Надеюсь, что помогает

1 голос
/ 18 марта 2016

Для тех, кто все еще ищет, вы можете попробовать ответ Скотта. Вот как я это сделал, используя библиотеку ATLComTime.h, которая делает еще несколько шагов.

FileTime fileTime = yourFileTime;
// dateFileTime will automatically cast to DATE when used as a parameter
COleDateTime dateFileTime(fileTime);  

Поскольку DATE является дружественным для COM типом, вы можете просто указать переменную dateFileTime в качестве параметра метода. Если вы все еще хотите использовать VARIANT, просто установите переменную dateFileTime в VARIANT.

VARIANT varDate;
VariantInit(&varDate);
varDate.vt = VT_DATE;
varDate.date = dateFileTime;
// Use the varDate varaible
// ... call some method or use locally
// Don't forget to clear the VARIANT from memory after use
VariantClear(&varDate);

В вызываемом методе (все еще в C ++), т.е. возвращении FILETIME из переменной DATE. COleDateTime хочет дать вам SYSTEMTIME вместо FILETIME, поэтому мы должны перепрыгнуть через несколько обручей.

FILETIME fileTime;
if (variantDateTime.vt == VT_DATE) // only use if DATE was put into a VARIANT
{
  COleDateTime oleDateTime(variantDateTime.date);
  SYSTEMTIME sysTime;
  oleDateTime.GetAsSystemTime(sysTime);
  SystemTimeToFileTime(&sysTime, &fileTime);
}

Если вы не использовали VARIANT, вы можете просто инициализировать тип COleDateTime с помощью переменной DATE.

COleDateTime oleDateTime(dateVariable);
... // etc as above

Как указывалось выше, это немного больше работы, чем Скоттс отвечает, но это еще один способ получить FILETIME через барьер интерфейса COM.

1 голос
/ 29 марта 2012

Ответ таков: вы не можете хранить ФИЛЬТРИМ в ВАРИАНТЕ.Из файла заголовка:

 *  VT_FILETIME               [P]     FILETIME

обратите внимание на [P] и ключ над ним в файле заголовка:

 * * [V] - may appear in a VARIANT
 * * [T] - may appear in a TYPEDESC
 * * [P] - may appear in an OLE property set
 * * [S] - may appear in a Safe Array

FILETIME может появляться только в наборе свойств OLE - невариант.

Существует VT_DATE, который вы могли бы использовать вместо этого.

...