我想从c/C++中的FILETIME创建VARIANT或_variant_t。
基本上,这就是我想要的:从FILETIME创建变体
FILETIME ft;
//Populate ft
VARIANT vFt;
VariantInit(&vFt);
vFt.vt = VT_FILETIME;
现在,我该如何设置内部VFT英尺?
任何人都可以帮助我吗?
感谢, SAURABH
我想从c/C++中的FILETIME创建VARIANT或_variant_t。
基本上,这就是我想要的:从FILETIME创建变体
FILETIME ft;
//Populate ft
VARIANT vFt;
VariantInit(&vFt);
vFt.vt = VT_FILETIME;
现在,我该如何设置内部VFT英尺?
任何人都可以帮助我吗?
感谢, SAURABH
答案是,你不能在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代替。
我需要在C++(syncReadRaw)中调用接受变体的OPC HDA自动化功能。此变体可以包含相对时间(以字符串形式)或绝对时间(以FILETIME形式)。我需要发送绝对时间到这个函数。有没有其他的选择来实现这个目标?谢谢。 – Paws 2012-03-29 07:05:22
OPC文档没有描述如何对其进行编码? – JTeagle 2012-03-29 07:07:54
不幸的是,他们还没有在C++中给出一个工作示例。他们给了VB一个,但只使用相对时间。所以,现在,如果发送FILETIME不可能,那么我将不得不考虑将绝对时间(比如说30-mar-2012 10:15:23)转换为使用某些数学的相对时间。 – Paws 2012-03-29 07:11:14
使用InitVariantFromFileTime
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762323(v=vs.85).aspx
希望帮助
对于那些仍在寻找,你可以试试斯科特的答案。下面是我如何使用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
如前所述上面,它比斯科特的回答更多的工作,但另一种方式来获得跨越COM接口屏障FILETIME。
你真的这样做了两次,还是复制/粘贴错误? – 2012-03-29 06:55:13
对不起,复制粘贴错误。 – Paws 2012-03-29 06:58:52