2

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

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

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

谁能帮我解决这个问题?

谢谢, 索拉布

4

3 回答 3

2

答案是,您不能将 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 来代替。

奖金阅读

VARENUM 枚举 (wtypes.h)

下表显示了可以使用这些值的位置。

价值 变体 类型描述 属性集 安全阵列
VT_ARRAY ✔️
VT_BLOB ✔️
VT_BLOB_OBJECT ✔️
VT_BOOL ✔️ ✔️ ✔️ ✔️
VT_BSTR ✔️ ✔️ ✔️ ✔️
VT_BSTR_BLOB
VT_BYREF ✔️
VT_CARRAY ✔️
VT_CF ✔️
VT_CLSID ✔️
VT_CY ✔️ ✔️ ✔️ ✔️
VT_DATE ✔️ ✔️ ✔️ ✔️
VT_DECIMAL ✔️ ✔️ ✔️
VT_DISPATCH ✔️ ✔️ ✔️
VT_EMPTY ✔️ ✔️
VT_ERROR ✔️ ✔️ ✔️ ✔️
VT_FILETIME ✔️
VT_HRESULT ✔️
VT_I1 ✔️ ✔️ ✔️ ✔️
VT_I2 ✔️ ✔️ ✔️ ✔️
VT_I4 ✔️ ✔️ ✔️ ✔️
VT_I8 ✔️ ✔️
VT_INT ✔️ ✔️ ✔️ ✔️
VT_INT_PTR ✔️
VT_LPSTR ✔️ ✔️
VT_LPWSTR ✔️ ✔️
VT_NULL ✔️ ✔️
VT_PTR ✔️
VT_R4 ✔️ ✔️ ✔️ ✔️
VT_R8 ✔️ ✔️ ✔️ ✔️
VT_RECORD ✔️ ✔️ ✔️
VT_SAFEARRAY ✔️
VT_STORAGE ✔️
VT_STORED_OBJECT ✔️
VT_STREAM ✔️
VT_STREAMED_OBJECT ✔️
VT_UI1 ✔️ ✔️ ✔️ ✔️
VT_UI2 ✔️ ✔️ ✔️ ✔️
VT_UI4 ✔️ ✔️ ✔️ ✔️
VT_UI8 ✔️ ✔️
VT_UINT ✔️ ✔️ ✔️
VT_UINT_PTR ✔️
VT_UNKNOWN ✔️ ✔️ ✔️
VT_USERDEFINED ✔️
VT_VARIANT ✔️ ✔️ ✔️ ✔️
VT_VECTOR ✔️
VT_VERSIONED_STREAM ✔️
VT_VOID ✔️
于 2012-03-29T07:00:32.280 回答
1

使用 InitVariantFromFileTime

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

希望有帮助

于 2014-05-08T19:04:06.400 回答
1

对于那些仍在寻找的人,您可以尝试 Scott 的回答。这是我使用 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 的方法。

于 2016-03-17T23:34:09.847 回答