从FILETIME创建变体

时间:2012-03-29 06:53:26

标签: c++ variant opc

我想用c / c ++中的FILETIME创建VARIANT或_variant_t。
基本上,这就是我想要的:

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

现在,如何在vFt中设置ft?

有人可以帮我解决这个问题吗?

谢谢, SAURABH

3 个答案:

答案 0 :(得分:1)

答案是,您无法在VARIANT中存储FILETIME。从头文件:

 *  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代替。

答案 1 :(得分:1)

答案 2 :(得分:1)

对于那些仍在寻找的人,你可以尝试斯科特的回答。以下是我使用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 ++中),即从DATE变量获取FILETIME。 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,你可以用DATE变量初始化COleDateTime类型。

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

如上所述,它比Scotts的回答要多一些,但是另一种在COM接口屏障中获得FILETIME的方法。