2012-03-29 5 views
2

Я хочу создать VARIANT или _variant_t из FILETIME в c/C++.
В принципе, это то, что я хочу:Создать вариант из FILETIME

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

Теперь, как я устанавливаю футов внутри VFT?

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

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

+0

Вы действительно делаете это дважды, или это ошибка копирования/вставки? –

+0

Извините, скопируйте ошибку патча. – Paws

ответ

0

Ответ, вы не можете хранить FILETIME в VARIANT. Из заголовка файла:

* 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, который вы могли бы использовать вместо этого.

+0

Мне нужно вызвать функцию OPC HDA Automation в C++ (syncReadRaw), которая принимает вариант. Этот вариант может содержать либо относительное время (как строку), либо абсолютное время (как FILETIME). Мне нужно отправить абсолютные значения этой функции. Есть ли другой вариант для достижения этого? Благодарю. – Paws

+0

Описывает ли документация OPC, как ее кодировать? – JTeagle

+0

К сожалению, они не дали рабочего примера в C++. Они дали один для VB, но только с использованием относительных времен. Итак, теперь, если отправка FILETIME не будет возможной, мне придется подумать о том, чтобы преобразовать абсолютное время (например, 30 марта 2012 года 10:15:23) относительной, используя некоторую математику. – Paws

1

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

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

С ДАТЫ является 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); 
} 

Если вы не использовали ВАРИАНТ вы можете просто инициализировать тип COleDateTime с переменной DATE.

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

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

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