c/c++ で FILETIME から VARIANT または _variant_t を作成したいと考えています。
基本的に、これは私が欲しいものです:
FILETIME ft;
//Populate ft
VARIANT vFt;
VariantInit(&vFt);
vFt.vt = VT_FILETIME;
では、vFt 内に ft を設定するにはどうすればよいですか?
誰でもこれで私を助けてもらえますか?
ありがとう、サウラブ
答えは、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 があります。
次の表に、これらの値を使用できる場所を示します。
価値 | 変異体 | 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 | ✔️ |
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 は、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 を取得する別の方法です。