2012-03-29 16 views
2

Ich möchte eine VARIANT oder _variant_t aus einer FILETIME in C/C++ erstellen.
Im Grunde ist es das, was ich will:Create Variant from FILETIME

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

Nun, wie kann ich ft innen VFT?

Kann mir bitte jemand dabei helfen?

Danke, Saurabh

+0

Machst du es wirklich zweimal oder ist es ein Kopier-/Einfügefehler? –

+0

Entschuldigen Sie, kopieren Sie Paste-Fehler. – Paws

Antwort

0

Die Antwort ist, können Sie keine FILE in einem VARIANT speichern. Von der Header-Datei:

* VT_FILETIME    [P]  FILETIME 

Anmerkung [P] und der Taste oben in der Header-Datei:

* * [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 

FILE kann in einer OLE-Objekt erscheint nur - keine Variante.

Es gibt möglicherweise ein VT_DATE, das Sie möglicherweise verwenden können.

+0

Ich muss eine OPC HDA-Automatisierungsfunktion in C++ (syncReadRaw) aufrufen, die eine Variante akzeptiert. Diese Variante kann entweder eine relative Zeit (als String) oder eine absolute Zeit (als FILETIME) enthalten. Ich muss absolute Zeiten an diese Funktion senden. Gibt es eine andere Möglichkeit, dies zu erreichen? Vielen Dank. – Paws

+0

Beschreibt die OPC-Dokumentation nicht, wie sie zu codieren ist? – JTeagle

+0

Leider haben sie kein funktionierendes Beispiel in C++ gegeben. Sie haben eine für VB angegeben, verwenden aber nur relative Zeiten. So, jetzt, wenn das Senden einer FILETIME nicht möglich sein wird, dann werde ich daran denken müssen, eine absolute Zeit (wie zB 30-März-2012 10:15:23) in eine relative zu konvertieren, die etwas Mathe verwendet. – Paws

1

Für diejenigen, die noch hilft suchen Sie versuchen, die Antwort von Scott kann. Hier ist, wie ich es mit der Bibliothek ATLComTime.h gemacht habe, die noch ein paar Schritte benötigt.

FileTime fileTime = yourFileTime; 
// dateFileTime will automatically cast to DATE when used as a parameter 
COleDateTime dateFileTime(fileTime); 

Seit DATE ist ein COM-freundliche Art Sie einfach die ‚dateFileTime‘ Variable als Methodenparameter geben kann. Wenn Sie den VARIANT weiterhin verwenden möchten, setzen Sie die Variable 'dateFileTime' einfach in einen 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); 

In der aufgerufenen Methode (immer noch in C++), dh die FILETIME von einer Date-Variable zurückbekommen. Die COleDateTime möchte Ihnen eine SYSTEMTIME anstatt einer FILETIME geben, also müssen wir ein paar Hoops überspringen.

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); 
} 

Wenn Sie keinen VARIANT verwenden, so können Sie nur den Typen Coledatetime mit dem DATE Variable initialisieren.

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

Wie oben erwähnt es ein bisschen mehr Arbeit als Scotts Antwort ist, aber eine andere Möglichkeit, eine FILE über die COM-Schnittstelle Barriere zu erhalten.