Probleme beim auslesen(ändern) der Systemzeit über WinApi

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

dubitat

Betreff: Probleme beim auslesen(ändern) der Systemzeit über WinApi

BeitragFr, Jan 09, 2009 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich spiele im Moment ein wenig mit der WinApi rum und habe ein Problem mit der Systemzeit. Ich kriege einfach keine sinvollen Werte ausgelesen.

Dokumentation der Befehle:
Code: [AUSKLAPPEN]
typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wDay;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wMilliseconds;
} SYSTEMTIME,
 *PSYSTEMTIME;

void WINAPI GetSystemTime(
  __out  LPSYSTEMTIME lpSystemTime
);


Mein BMax Code sieht daraufhin wie folgt aus (Ich kann mit dem Variablentyp WORD überhaupt nichts anfangen. In VisualBasic Beispielen sind Integer in der selben Struktur verwendet, weshalb ich das dann auch so gemacht habe:

Code: [AUSKLAPPEN]

Strict

Extern "win32"
Function win32_LoadLibrary:Int(lpFileName$z) = "LoadLibraryA@4"
Function win32_GetProcAddress:Byte Ptr(hModule:Int, lpProcName$z) = "GetProcAddress@8"
End Extern

Function SetSystemTime()
 Local hModule:Int = win32_LoadLibrary("kernel32.dll")
 If hModule = 0 Then
    Return
 EndIf

 Type SystemTime
  Field wYear:Int
  Field wMonth:Int
  Field wDayOfWeek:Int
  Field wDay:Int
  Field wHour:Int
  Field wMinute:Int
  Field wSecond:Int
  Field wMilliseconds:Int
 End Type

 Type FileTimeDLL
  Field high:Int
  Field low:Int
 End Type

 Local GetDLLSystemTime(time:SystemTime) "win32"=win32_GetProcAddress(hModule, "GetSystemTime")
 Local GetDLLFileTime(time:SystemTime, time2:FileTimeDLL) "win32"=win32_GetProcAddress(hModule, "SystemTimeToFileTime")
 
 Local curr:SystemTime=New SystemTime
 GetDLLSystemTime(curr)
 Local currFile:FileTimeDLL=New FileTimeDLL
 GetDLLFileTime(curr,currFile)
 
 Print currFile.low
End Function


Ich bekomme weder eine vernünftige Ausgabe von curr.wYear,... noch von currFile.low. Letzlich ist mir das Datumsformat relativ egal, solange man damit irgendwie rechnen kann usw.

Später soll die Systemzeit gesetzt werden können über das Programm.

mfg
dubitat
Erare humanum est - Irren ist Menschlich

Suco-X

Betreff: .....

BeitragFr, Jan 09, 2009 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Word = 2 byte. Short wäre also der richtige Datentyp.
Ich habe es mal kurz ausgetestet und es klappt alles ohne Probleme:

Code: [AUSKLAPPEN]

Strict

Extern "win32"
   Function GetLocalTime(structST:Byte Ptr)
   Function SetLocalTime(structST:Byte Ptr)
End Extern

Type SystemTime
  Field wYear:Short
  Field wMonth:Short
  Field wDayOfWeek:Short
  Field wDay:Short
  Field wHour:Short
  Field wMinute:Short
  Field wSecond:Short
  Field wMilliseconds:Short
End Type

Local test:SystemTime = New SystemTime
GetLocalTime(test)

Print "Jahr: "+test.wYear
Print "Monat: "+test.wMonth
Print "Tag: "+test.wDayOfWeek


'Mit den folgenden zwei Zeilen wird der Februar als Monat festgelegt.
'test.wMonth = 2
'SetLocalTime(test)


Mir ist auch rätselhaft wieso du in diesem Fall mit LoadLibrary arbeitest!?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Vertex

BeitragFr, Jan 09, 2009 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal http://www.willemer.de/informatik/cpp/timelib.htm an! Pub.StdC hat die Funktionen time_, localtime_ und strftime_ bereits implementiert (multiplattform). Mit localtime_ kannst du eine tm - Struktur füllen die so aufgebaut ist:
Code: [AUSKLAPPEN]
struct tm {
   int tm_sec;      /* Sekunden - [0,61] */
   int tm_min;      /* Minuten - [0,59] */
   int tm_hour;     /* Stunden - [0,23] */
   int tm_mday;     /* Tag des Monats - [1,31] */
   int tm_mon;      /* Monat im Jahr - [0,11] */
   int tm_year;     /* Jahr seit 1900 */
   int tm_wday;     /* Tage seit Sonntag (Wochentag) - [0,6] */
   int tm_yday;     /* Tage seit Neujahr (1.1.) - [0,365] */
   int tm_isdst;    /* Sommerzeit-Flag */
}


mfg olli
vertex.dreamfall.at | GitHub
 

dubitat

BeitragFr, Jan 09, 2009 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Olli,
danke für deine prompte Hilfe. Kann ich damit auch irgendwie die Zeit setzen? Das ist der eigentlich einzige Grund, warum ich über die WindowsApi gehen wollte, weil ich die Systemzeit inkl. Datum ändern wollte.

mfg
dubitat
Erare humanum est - Irren ist Menschlich
 

dubitat

BeitragFr, Jan 09, 2009 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Suco,
Ollis Antwort war schneller als die Benachrichtungsemail bei mir. Deine Lösung gefällt mir sehr gut und funktioniert super. Danke hierfür! (Ich habe vorhin nur Ollis Nachricht gelesen :S ) Wieso kann man als Datentyp nicht die Type Struktur angeben, sondern muss Byte Ptr angeben?

mfg
Lasse
Erare humanum est - Irren ist Menschlich

kog

BeitragFr, Jan 09, 2009 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
weil du damit einen Pointer auf den Struktureintrag angibst. und die WinAPI weiss dann, sie muss in dem Speicherbereich einschreiben. Damit sie die daten nicht zurückgeben muss

DAK

BeitragMo, Jan 12, 2009 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
kann das iwer umschreiben, dass es auch unter win7 rennt? oder hat wer nen tipp, wo ich was dazu für win7 find?
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group