Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
*-- The program displays the timezone information
* using the GetTimeZoneInformation() Win32 API function.
declare integer GetTimeZoneInformation ;
in Win32API ;
string @lcResultStructure
*-- lcResultStructure is of type:
*!* typedef struct _TIME_ZONE_INFORMATION { // tzi
*!* LONG Bias;
*!* WCHAR StandardName[ 32 ];
*!* SYSTEMTIME StandardDate;
*!* LONG StandardBias;
*!* WCHAR DaylightName[ 32 ];
*!* SYSTEMTIME DaylightDate;
*!* LONG DaylightBias;
*!* } TIME_ZONE_INFORMATION;
*-- Total structure length: 172 chars
*-- LONG = 16 bit signed integer
*-- WCHAR = Unicode char (16 bit)
*-- Initialize the output variable
lcResultStructure = replicate(chr(0), 172)
*-- Get the timezone info
= GetTimeZoneInformation(@lcResultStructure)
*-- The LongToNumber(), WordToNumber() and UnicodeToANSI()
* functions are defined at the end of this program.
*-- Extract/Display the results
? "Current bias: ", LongToNumber(left(lcResultStructure, 4))
?
? "Standard Time: ", UnicodeToANSI(substr(lcResultStructure, 5, 64))
? "Transition from daylight to standard time occurs on:"
? "Year: ", WordToNumber(substr(lcResultStructure, 69, 2))
? "Month: ", WordToNumber(substr(lcResultStructure, 71, 2))
? "Day of week: ", WordToNumber(substr(lcResultStructure, 73, 2))
? "Day: ", WordToNumber(substr(lcResultStructure, 75, 2))
? "Hour: ", WordToNumber(substr(lcResultStructure, 77, 2))
? "Minute: ", WordToNumber(substr(lcResultStructure, 79, 2))
? "Second: ", WordToNumber(substr(lcResultStructure, 81, 2))
? "MiliSec: ", WordToNumber(substr(lcResultStructure, 83, 2))
? "Bias: ", LongToNumber(substr(lcResultStructure, 85, 4))
?
? "Daylight Time: ", UnicodeToANSI(substr(lcResultStructure, 89, 64))
? "Transition from standard to daylight time occurs on:"
? "Year: ", WordToNumber(substr(lcResultStructure, 153, 2))
? "Month: ", WordToNumber(substr(lcResultStructure, 155, 2))
? "Day of week: ", WordToNumber(substr(lcResultStructure, 157, 2))
? "Day: ", WordToNumber(substr(lcResultStructure, 159, 2))
? "Hour: ", WordToNumber(substr(lcResultStructure, 161, 2))
? "Minute: ", WordToNumber(substr(lcResultStructure, 163, 2))
? "Second: ", WordToNumber(substr(lcResultStructure, 165, 2))
? "MiliSec: ", WordToNumber(substr(lcResultStructure, 167, 2))
? "Bias: ", LongToNumber(substr(lcResultStructure, 169, 4))
return && Main function
*==========================================
*-- Converts a number from LONG binary format
* to VFP numeric format.
function LongToNumber
lparameter tcDWord
local lnReturn, lnI
*-- Check the parameter
if (type("tcDWord") <> "C") or (len(tcDWord) < 4)
return 0
endif
*-- Convert the number
lnReturn = 0
for lnI = 1 to 4
lnReturn = asc(substr(tcDWord, 5-lnI, 1)) + lnReturn
if lnI <> 4
lnReturn = lnReturn * 256
endif
endfor
*-- Adjust for signed numbers.
* (LONG is a signed numeric format)
if lnReturn > 2147483647
lnReturn = lnReturn - 0x100000000
endif
return lnReturn && LongToNumber
*==========================================
*-- Converts a number from WORD binary format
* to VFP numeric format.
function WordToNumber
parameter tcWord
local lnReturn, lnI
*-- Check the parameter
if (type("tcWord") <> "C") or (len(tcWord) < 2)
return 0
endif
*-- Convert the number
lnReturn = asc(left(tcWord, 1)) + asc(substr(tcWord, 2, 1)) * 256
return lnReturn && WordToNumber
*==========================================
*-- Converts a Unicode string to ANSI string.
function UnicodeToANSI
lparameter tcUnicodeString
local lcReturn, lnAt
lcReturn = strconv(strconv(tcUnicodeString, 6), 2)
lnAt = at(chr(0), lcReturn)
if lnAt > 0
lcReturn = left(lcReturn, lnAt - 1)
endif
return lcReturn && UnicodeToANSI
* Program....: TESTREGBIN.PRG
* Version....: 1.0
* Author.....: ** Richard G Bean **
* Date.......: February 23, 1999
* Notice.....: [b]Copyleft[/b] 1999 ** Melange Computer Services, Inc. **
* Abstract...: Test new REGISTRY functionallity - Return 32-bit binary values
* Changes....:
#DEFINE HKEY_LOCAL_MACHINE -2147483646 && BITSET(0,31)+2
LOCAL lcRegValue, lcRegfile, lnRetVal, oReg
lnRegValue = 0 && by passing a numeric value, it will assume requested is 32-bit binary
lcRegfile = "REGISTRY"
lnRetVal = 0
SET PROCEDURE TO (m.lcRegfile) ADDITIVE
oReg = CreateObject("Registry")
lnRetVal = oReg.GetRegKey("ActiveTimeBias",@lnRegValue,;
"System\CurrentControlSet\control\TimeZoneInformation", HKEY_LOCAL_MACHINE)
IF lnRetVal = 0
IF lnRegValue > 0x80000000 && East of GMT
lnRegValue = lnRegValue-0xFFFFFFFF -1
ENDIF
ELSE
lnRegValue = 0 && should probably return "special" value
ENDIF
RELEASE oReg
RELEASE PROC (m.lcRegfile)
RETURN lnRegValue
*!* EOP: TESTREGBIN.PRG
* --- Set Specifically To RGBean's Class ---
SET CLASSLIB TO "F:\Campaign Management\Program\Other Programs\Registry.vcx" ADDITIVE
#DEFINE HKEY_LOCAL_MACHINE -2147483646 && BITSET(0,31)+2
#DEFINE REG_RUN "System\CurrentControlSet\Control\TimeZoneInformation"
loReg = CreateObject('Registry')
lnRegStat = loReg.OpenKey(REG_RUN,HKEY_LOCAL_MACHINE,.T.)
IF lnRegStat = 0
loReg.SetKeyValue("ActiveTimeBias", 360)
loReg.SetKeyValue("Bias", 420)
loReg.SetKeyValue("DaylightName","Mountain Daylight Time")
loReg.SetKeyValue("StandardName","Mountain Daylight Time")
ENDIF
RELEASE loReg
....
loReg = CreateObject('Registry')
*!* lnRegStat = loReg.OpenKey(REG_RUN,HKEY_LOCAL_MACHINE,.T.)
*!* IF lnRegStat = 0
*!* loReg.SetKeyValue("ActiveTimeBias", 360)
*!* loReg.SetKeyValue("Bias", 420)
*!* loReg.SetKeyValue("DaylightName","Mountain Daylight Time")
*!* loReg.SetKeyValue("StandardName","Mountain Daylight Time")
*!* ENDIF
lnRetVal = loReg.SetRegKey("ActiveTimeBias", 360,;
REG_RUN, HKEY_LOCAL_MACHINE)
lnRetVal = loReg.SetRegKey("Bias", 420,;
REG_RUN, HKEY_LOCAL_MACHINE)
lnRetVal = loReg.SetRegKey("DaylightName","Mountain Daylight Time",;
REG_RUN, HKEY_LOCAL_MACHINE)
lnRetVal = loReg.SetRegKey("StandardName","Mountain Daylight Time",;
REG_RUN, HKEY_LOCAL_MACHINE)
...
[code]
It looks like there are some differences in using .OpenKey and .SetKeyValue() compared to .SetRegKey().
Rick
I guess it's time to figure out the API call necessary!Values in the TimeZoneInformation key should be maintained only by choosing the Date/Time icon in Control Panel or by applications using the Win32 APIs. Changing this information in the Registry can damage your system's local time settings.
*-- Converts a ANSI string to Unicode string.
function ANSIToUnicode
lparameter tcANSIString
local lcReturn
lcReturn = strconv(strconv(tcANSIString, 1), 5)
return lcReturn && ANSIToUnicode
For Example:
LongToNumber(CHR(164)+CHR(1)+CHR(0)+CHR(0)) = 420
LongToNumber(CHR(196)+CHR(255)+CHR(255)+CHR(255)) = -60
WordToNumber(CHR(10)+CHR(0)) = 10
? WordToNumber(num2str(12345,2))
? LongToNumber(num2str(4567890,4))
****************
FUNCTION num2str
PARAMETERS znnum, znoutlen
PRIVATE lnii, lnjj, lcasc
IF PARAMETERS() < 2 OR TYPE('znoutlen') != 'N'
znoutlen = 1
ENDIF
znoutlen = MAX(1, MIN(8, znoutlen))
lnii = INT(znnum)
lcasc = ''
DO WHILE lnii > 0
znnum = lnii
lnii = INT(znnum / 256)
lnjj = znnum % 256
lcasc = lcasc + CHR(lnjj)
ENDDO
IF LEN(lcasc) < znoutlen
lcasc = PADR(lcasc, znoutlen, CHR(00))
ENDIF
RETURN lcasc