【问题标题】:Create Variant from FILETIME从 FILETIME 创建变体
【发布时间】:2012-03-29 06:53:25
【问题描述】:

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

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

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

谁能帮我解决这个问题?

谢谢, 索拉布

【问题讨论】:

  • 你真的做了两次,还是复制/粘贴错误?
  • 抱歉,复制粘贴错误。

标签: c++ variant opc


【解决方案1】:

答案是,您不能将 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 enumeration (wtypes.h)

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

Value VARIANT TYPEDESC Property set Safe array
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 ✔️

【讨论】:

  • 我需要在接受变体的 C++ (syncReadRaw) 中调用 OPC HDA 自动化函数。此变体可以包含相对时间(作为字符串)或绝对时间(作为 FILETIME)。我需要向这个函数发送绝对时间。有没有其他选择可以实现这一目标?谢谢。
  • 不幸的是,他们没有给出 C++ 的工作示例。他们为 VB 提供了一个,但仅使用相对时间。因此,现在,如果无法发送 FILETIME,那么我将不得不考虑使用一些数学将绝对时间(例如 2012 年 3 月 30 日 10:15:23)转换为相对时间。跨度>
  • 是否可以传递 OPCHDA_TIME(设置 ftTime 成员)?我从留言板上得到了这个,我想知道这个结构是否是一个变体的 OPC 扩展......
  • 更新:能够通过将 FILETIME 转换为 DATE 并从中构造一个变体来解决此问题:DATE d = convertFileTimeToDate(ft); _variant_t vDate(d); //调用传递vDate的opc函数感谢JTeagle。问候,Saurabh
【解决方案2】:

【讨论】:

    【解决方案3】:

    对于那些仍在寻找的人,您可以尝试 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 的另一种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2019-03-20
      相关资源
      最近更新 更多