【问题标题】:How to pass time_t or simply its date information over COM如何通过 COM 传递 time_t 或仅传递其日期信息
【发布时间】:2017-12-10 16:58:56
【问题描述】:

我有一个 Visual C++ ATL 项目,它公开了一个 COM 接口。

我正在从我的界面调用 FlexNet Publisher 库。我需要从这些库中返回一个日期,这些库公开了一个我可以获取的 time_t 对象(是的,我知道他们的库容易受到 32 位系统上的 2038 错误的影响)。

我的 IDL 文件上有一个需要返回此日期的方法。

鉴于我可以获取time_t,我如何通过 COM 接口边界将其日期信息传递给使用我的 COM 对象的客户端应用程序?我是否应该将time_t 转换为__int64 并在我的IDL 中将其定义为__int64?什么是正确的?标准方式是什么?

【问题讨论】:

    标签: date visual-c++ com atl idl


    【解决方案1】:

    我建议使用符合 oleautomation 的 DATE 类型。

    要转换现有的 time_t 类型,请使用 ATL 提供的 COleDateTime 类。其中一个constructors 接受time_t 值并将其解析为等效的DATE 值。

    【讨论】:

      【解决方案2】:

      正确的方法是使用DATE 类型或VARIANT。从time_t 到达那里需要进行几次转换。

      以下代码的标题:

      #include <windows.h>
      #include <comdef.h>
      #include <oleauto.h>
      #include <time.h>
      #include <exception>
      

      首先,获取你要转换的 C++ time_t

      // get the time_t to convert
      time_t cpp_time = ...;
      

      然后,将 C++ time_t 转换为 Windows FILETIME。 (此部分摘自here)。

      // convert C++ time_t to Windows FILETIME
      FILETIME windows_file_time;
      {
          auto ll = Int32x32To64(cpp_time, 10000000) + 116444736000000000;
          windows_file_time.dwLowDateTime = (DWORD)ll;
          windows_file_time.dwHighDateTime = ll >> 32;
      }
      

      然后,将 Windows FILETIME 转换为 Windows SYSTEMTIME

      // convert Windows FILETIME to Windows SYSTEMTIME
      SYSTEMTIME windows_system_time;
      if (!FileTimeToSystemTime(&windows_file_time, &windows_system_time))
          throw new std::exception();
      

      最后,将 Windows SYSTEMTIME 转换为 VARIANT DATE

      // convert Windows FILETIME to VARIANT DATE
      DATE variant_date;
      if (SystemTimeToVariantTime(&windows_system_time, &variant_date) != TRUE)
          throw new std::exception();
      

      如果您想验证上述是否有效,您可以将DATE 转换为字符串(BSTR)。

      // convert DATE to string (for verification purposes)
      bstr_t variant_date_string;
      if (FAILED(VarBstrFromDate(variant_date, 0, 0, variant_date_string.GetAddress())))
          throw new std::exception();
      OutputDebugStringW(variant_date_string);
      

      如果您需要/想要使用VARIANT 而不是DATE,只需将DATE 包装在VARIANT 结构中即可。

      // wrap DATE in a VARIANT
      VARIANT v_variant_date;
      v_variant_date.date = variant_date;
      v_variant_date.vt = VT_DATE;
      

      要验证这部分是否有效,您可以将 VARIANT 转换为字符串 (BSTR)。

      // convert VARIANT to string (for verification purposes)
      variant_t v_variant_date_string;
      v_variant_date_string.ChangeType(VT_BSTR, &v_variant_date);
      OutputDebugStringW(v_variant_date_string.bstrVal);
      

      【讨论】:

        猜你喜欢
        • 2021-01-15
        • 2021-02-02
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2016-02-17
        相关资源
        最近更新 更多