Win32 C++ SystemTimeToFileTime und FileTimeToLocalFileTime, die nach VariantTimeToSystemTime aufgerufen werden, liefern C++

Programme in C++. Entwicklerforum
Anonymous
 Win32 C++ SystemTimeToFileTime und FileTimeToLocalFileTime, die nach VariantTimeToSystemTime aufgerufen werden, liefern

Post by Anonymous »

Ich lese den WPD_OBJECT_DATE_MODIFIED-Zeitwert einer Datei/eines Ordners auf einem tragbaren Gerät (WPD) und muss ihn ähnlich wie der Explorer anzeigen. Ich habe einen Ordner, dessen Änderungsdatum im Explorer als 01.01.2015 12:00 Uhr angezeigt wird..
Ich benötige die gleiche formatierte Zeichenfolge. In meiner Anwendung funktioniert der folgende Code, aber die Werte sind nicht wie folgt:

Code: Select all

SYSTEMTIME systemTime = { 0 };
FILETIME fileTime = { 0 };
FILETIME localFileTime = { 0 };
PROPVARIANT pvDateModified;
PropVariantInit(&pvDateModified);
//...
HRESULT hrDateModified = pObjectProperties->GetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
if (pvDateModified.vt != VT_EMPTY) {

// (0) Comes back as Variant Time:
// RESULT:
//        pvDateModified.date = 42005.000000000

// (1) Need to convert to System Time first:
// RESULT:
//        wYear=2015
//        wMonth=1
//        wDay=1
VariantTimeToSystemTime(pvDateModified.date, &systemTime);

// (3) In order to use SHDateFormatTime, need to convert to File Time:
// RESULT:
//        dwLowDateTime  = 3803807744
//        dwHighDateTime = 30418261
SystemTimeToFileTime(&systemTime, &fileTime);

// (4) Format using SHFormatDateTime:
// RESULT:
//        12/31/2014 7:00 PM
wchar_t datebuf[80];
DWORD flags = FDTF_NOAUTOREADINGORDER | FDTF_DEFAULT; // tried with and without, no difference
SHFormatDateTime(&fileTime, &flags, datebuf, 80);
//...
}
Das Ergebnis ist um 5 Stunden, 31.12.2014, 19:00 Uhr, falsch. Dann habe ich versucht, weiter zu gehen und die Ortszeit zu ermitteln, und es hat mich noch weiter zurückgeworfen, auf den 31.12.2014, 14:00 Uhr:

Code: Select all

// (4) Convert to Local Time First:
// RESULT:
//         dwLowDateTime   = 4192434176
//         dwHighDateTime  = 30418219
FileTimeToLocalFileTime(&fileTime, &localFileTime);

// (5) Format using SHFormatDateTime:
// RESULT:
//         12/31/2014 2:00 PM
wchar_t datebuf[80];
DWORD flags = FDTF_NOAUTOREADINGORDER | FDTF_DEFAULT; // tried with and without, no difference
SHFormatDateTime(&localFileTime, &flags, datebuf, 80);
//...
Ich kann im Debugger sehen, dass die ursprüngliche Systemzeit systemTime korrekt ist: 01.01.2015. Aber ich kann diese Zeit nicht für den formatierten String-Aufruf SHFormatDateTime verwenden, es dauert nur eine FILETIME statt einer SYSTEMTIME. Aber irgendwo bei der Konvertierung von SYSTEMTIME zu FILETIME gibt es ein Problem.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post