我想在 c/c++ 中从 FILETIME 创建一个 VARIANT 或 _variant_t。
基本上,这就是我想要的:
FILETIME ft;
//Populate ft
VARIANT vFt;
VariantInit(&vFt);
vFt.vt = VT_FILETIME;
现在,我如何在 vFt 中设置 ft?
谁能帮我解决这个问题?
谢谢, 索拉布
答案是,您不能将 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 来代替。
下表显示了可以使用这些值的位置。
价值 | 变体 | 类型描述 | 属性集 | 安全阵列 |
---|---|---|---|---|
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 | ✔️ |
使用 InitVariantFromFileTime
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762323(v=vs.85).aspx
希望有帮助
对于那些仍在寻找的人,您可以尝试 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 的方法。