如何通过 COM 传递 time_t 或只是它的日期信息
How to pass time_t or simply its date information over COM
我有一个公开 COM 接口的 Visual C++ ATL 项目。
我正在从我的界面调用 FlexNet Publisher 库。我需要 return 从这些库中返回一个日期,这些库公开了一个我可以获取的 time_t
对象(是的,我知道它们的库在 32 位系统上容易受到 2038 错误的影响)。
我的 IDL 文件中有一个方法需要 return 这个日期。
鉴于我可以获取 time_t
,我如何将其日期信息跨越 COM 接口边界传递到使用我的 COM 对象的客户端应用程序?我应该将 time_t
转换为 __int64
并在我的 IDL 中将其定义为 __int64
吗?这里有什么是对的?什么是标准方式?
正确的方法是使用DATE
类型或VARIANT
。要从 time_t
到达那里需要一些转换。
Headers 以下代码:
#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);
如果您 need/want 使用 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);
我建议使用符合 oleautomation 的 DATE
类型。
要转换现有的 time_t
类型,请使用 COleDateTime class, which is provided by ATL. One of its constructors 接受 time_t
值并将其解析为等效的 DATE
值。
我有一个公开 COM 接口的 Visual C++ ATL 项目。
我正在从我的界面调用 FlexNet Publisher 库。我需要 return 从这些库中返回一个日期,这些库公开了一个我可以获取的 time_t
对象(是的,我知道它们的库在 32 位系统上容易受到 2038 错误的影响)。
我的 IDL 文件中有一个方法需要 return 这个日期。
鉴于我可以获取 time_t
,我如何将其日期信息跨越 COM 接口边界传递到使用我的 COM 对象的客户端应用程序?我应该将 time_t
转换为 __int64
并在我的 IDL 中将其定义为 __int64
吗?这里有什么是对的?什么是标准方式?
正确的方法是使用DATE
类型或VARIANT
。要从 time_t
到达那里需要一些转换。
Headers 以下代码:
#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);
如果您 need/want 使用 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);
我建议使用符合 oleautomation 的 DATE
类型。
要转换现有的 time_t
类型,请使用 COleDateTime class, which is provided by ATL. One of its constructors 接受 time_t
值并将其解析为等效的 DATE
值。