2

c/c++ で FILETIME から VARIANT または _variant_t を作成したいと考えています。
基本的に、これは私が欲しいものです:

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

では、vFt 内に ft を設定するにはどうすればよいですか?

誰でもこれで私を助けてもらえますか?

ありがとう、サウラブ

4

3 に答える 3

2

答えは、VARIANT に FILETIME を格納することはできないということです。ヘッダー ファイルから:

 *  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 列挙 (wtypes.h)

次の表に、これらの値を使用できる場所を示します。

価値 変異体 TYPEDESC プロパティ セット 安全配列
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_ディスパッチ ✔️ ✔️ ✔️
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_ストレージ ✔️
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 ✔️
于 2012-03-29T07:00:32.280 に答える
1

InitVariantFromFileTime を使用する

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762323(v=vs.85).aspx

それが役立つことを願っています

于 2014-05-08T19:04:06.400 に答える
1

まだ探している人は、スコットの答えを試すことができます。これは、さらにいくつかの手順を実行する 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 は、FILETIME ではなく SYSTEMTIME を提供する必要があるため、いくつかの手順を実行する必要があります。

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 を使用しなかった場合は、COleDateTime 型を DATE 変数で初期化するだけです。

COleDateTime oleDateTime(dateVariable);
... // etc as above

上記のように、Scotts の回答よりも少し手間がかかりますが、COM インターフェイスの障壁を越えて FILETIME を取得する別の方法です。

于 2016-03-17T23:34:09.847 に答える