Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[REBOL] Re: help with GetTimezoneInformation needed ...

From: antonr::lexicon::net at: 13-Mar-2005 23:36

Well, one thing I noticed is that Standard name is an array WCHARs, not chars. WCHAR is defined in winnt.h: typedef unsigned short wchar_t; typedef wchar_t WCHAR; So it is a fixed size (32 elements) array of shorts (16bits each). You can't just specify a rebol string! in the structure. (That's essentially just a pointer -> 4bytes) So your structure is not big enough. Afterwards you also have to convert the wchar array back to a string. This will show you how I've done it. I've got the routine doing filling the structure correctly, but I am not giving you all the code necessary to print it all out :) yet... (See bottom for code) Anton.
> I am trying to find out if red-icon-problem of IOS is caused by Rebol > incorrectly interpreting timezone info or it is OS who does it in > strange way, but I would need following routine to function :-) Sadly > enough, I get crashes .... > It survives the function call, but I can't touch structure, or I get > crash ... > > Thanks, > -pekr-
lib: load/library %kernel32.dll if error? set/any 'err try [ personalize: func ["personalises the element names in a struct spec" blk [block!] "A struct spec." name [word! string!] "Root name for each element. This will be prefixed to each element." /local result ][ result: copy blk if blk/1 = [save] [result: next result] forskip result 2 [result/1: to-word rejoin [name "_" result/1]] head result ] C-array-to-struct-spec: func ["Creates a struct spec to hold n values of type." type [word!] "datatype" name [word!] "root name for each element, eg. 'name -> name, name1, name2 ... namen" len [integer!] "length of the array" /save "Insert [save] to prevent the struct from being garbage collected." /local blk ][ blk: copy [] if save [insert/only blk [save]] repeat n len [append blk compose/deep [(to-word either n = 1 [name][join name n - 1]) [(type)]]] blk ;;blk: make struct! blk none ] _SYSTEMTIME: [ ; struct! specification Year [short] Month [short] DayOfWeek [short] Day [short] Hour [short] Minute [short] Second [short] Milliseconds [short] ] _TIME_ZONE_INFORMATION: compose [ Bias [long] ; difference, in minutes, between UTC and local time (C-array-to-struct-spec 'short 'StandardName 32) ;WCHAR[32]; (personalize _SYSTEMTIME 'StandardDate) ;SYSTEMTIME; transition from Daylight Savings to Standard time StandardBias [long] ; usually always zero (C-array-to-struct-spec 'short 'DaylightName 32) ;WCHAR[32]; (personalize _SYSTEMTIME 'DaylightDate) ;SYSTEMTIME; transition from Standard time to Daylight Savings DaylightBias [long] ; added to Bias to form the bias (in minutes) used during daylight savings. Usually -60. ] ;new-line/all/skip _TIME_ZONE_INFORMATION true 2 tz-info: make struct! _TIME_ZONE_INFORMATION none ;tz-info/DaylightBias: 1023 ;dump-memory get-struct-address tz-info ((size-of-struct? first tz-info) / 4) GetTimeZoneInformation: make routine! compose/deep [ LPTIME_ZONE_INFORMATION [struct! [(_TIME_ZONE_INFORMATION)]] return: [long] ; DWORD (unsigned long) ] lib "GetTimeZoneInformation" result: GetTimeZoneInformation tz-info print [ "GetTimeZoneInformation returned:" mold result select [ 0 TIME_ZONE_ID_UNKNOWN 1 TIME_ZONE_ID_STANDARD 2 TIME_ZONE_ID_DAYLIGHT ] result "^/Bias:" tz-info/Bias ] use [word][ foreach type [Standard Daylight][ word: to-word join type "Name" print rejoin [ word ": " wchar-array-to-string (get-struct-address tz-info) + (get-struct-element-offset tz-info word) 32 ] foreach granularity [Year Month Day DayOfWeek Hour Minute Second][ word: to-word rejoin [type "Date_" granularity] print rejoin [ word ": " do to-path reduce ['tz-info word] ] ] print rejoin [word: to-word join type "Bias" ": " do to-path reduce ['tz-info word]] ] print "----------------" ] ][ free lib err ;print mold disarm err ] free lib