|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Locale/Regionalization Routines GetGeoInfo: Determine Geographic Country Info by GeoID |
|
Posted: | Sunday August 15, 2004 |
Updated: | Monday December 26, 2011 |
Applies to: | VB4-32, VB5, VB6 |
Developed with: | VB6, Windows XP |
OS restrictions: | Windows ME, Windows XP, Windows Server 2003 |
Author: | VBnet - Randy Birch |
Related: |
GetGeoInfo: Obtaining Country List by Enumerating GeoIDs GetGeoInfo: Determine Geographic Country Info by GeoID EnumSystemLocales: Enumerate Installed and Supported System Locales GetLocaleInfo: Regional Locale Country Settings |
Prerequisites |
Windows ME, Windows XP or Windows Server 2003. |
|
If
you're running Windows ME, XP or Windows Server 2003 you have available an
API that will return info about a specific geographical area. This page
shows how to enumerate the available GeoIDs on a system and retrieve the
specific information or each GeoID. Although the routines are presented individually to more easily incorporate a specific wrapper in your app, they could easily be combined if the type of information requested was passed as a parameter to the function. Because this demo implements an enumeration routine a BAS module is required.
|
BAS Module Code |
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'UDT not required in working code. Its 'purpose here is to hold the GeoClas value 'determined in the form load event, and 'to receive the list index of the matching 'enumerated GeoID in order to set the list 'selection on start-up to that of the current user Private Type GeoInfo gClass As Long gIndex As Long End Type Public geo As GeoInfo Public Function EnumGeoInfoProc(ByVal geoid As Long) As Long 'add the data to the list With Form1.List1 'if the GeoID returned from the Enum 'matches the GeoID determined at Load 'for the user, append a string to that 'combo item and record the list index 'of that item If geoid <> geo.gClass Then .AddItem geoid .ItemData(.NewIndex) = geoid Else .AddItem geoid & " (user)" .ItemData(.NewIndex) = geoid geo.gIndex = .NewIndex 'save the index End If End With 'and return 1 to continue enumeration EnumGeoInfoProc = 1 End Function |
|
Form Code |
Create a form one text box (Text1) and set its index property to 0 - the Load event will create the text boxes. Space is left for labels but those are not created as part of this demo. Add a listbox (List1) along with the following code: |
|
Option Explicit 'SYSGEOTYPE Private Const GEO_NATION As Long = &H1 Private Const GEO_LATITUDE As Long = &H2 Private Const GEO_LONGITUDE As Long = &H3 Private Const GEO_ISO2 As Long = &H4 Private Const GEO_ISO3 As Long = &H5 Private Const GEO_RFC1766 = &H6 Private Const GEO_LCID As Long = &H7 Private Const GEO_FRIENDLYNAME As Long = &H8 Private Const GEO_OFFICIALNAME As Long = &H9 Private Const GEO_TIMEZONES As Long = &HA Private Const GEO_OFFICIALLANGUAGES As Long = &HB 'SYSGEOCLASS Private Const GEOCLASS_NATION As Long = 16 'only valid GeoClass value at present Private Const GEOCLASS_REGION As Long = 14 'defined but not yet supported by Windows Private Const GEOID_NOT_AVAILABLE As Long = -1 Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long Private Declare Function GetUserGeoID Lib "kernel32" _ (ByVal geoclass As Long) As Long Private Declare Function GetGeoInfo Lib "kernel32" _ Alias "GetGeoInfoA" _ (ByVal geoid As Long, _ ByVal GeoType As Long, _ lpGeoData As Any, _ ByVal cchData As Long, _ ByVal langid As Long) As Long Private Declare Function EnumSystemGeoID Lib "kernel32" _ (ByVal geoclass As Long, _ ByVal ParentGeoId As Long, _ ByVal lpGeoEnumProc As Long) As Long Private Declare Function lstrlenW Lib "kernel32" _ (ByVal lpString As Long) As Long Private Sub Form_Load() Dim cnt As Long 'set up some controls For cnt = 0 To 8 If cnt > 0 Then Load Text1(cnt) With Text1(cnt) .Left = 3800 .Top = 350 + (360 * (cnt)) .Width = 3880 .Text = "" .Visible = True End With Next 'get the geoclass for the current 'user and assign to UDT member for 'use in EnumGeoInfoProc geo.gClass = GetUserGeoID(GEOCLASS_NATION) Call EnumSystemGeoID(GEOCLASS_NATION, 0&, AddressOf EnumGeoInfoProc) With List1 .Top = 160 .Left = 3200 .Width = 3880 .Top = 160 .Left = 120 .Width = 1080 'set listindex to the combo item 'representing the current user GeoID .ListIndex = geo.gIndex .TopIndex = geo.gIndex End With End Sub Private Sub List1_Click() If List1.ListIndex > -1 Then Call GetGeoInformation(List1.ItemData(List1.ListIndex)) End If End Sub Private Sub GetGeoInformation(geoclass As Long) Dim LCID As Long If geoclass <> GEOID_NOT_AVAILABLE Then LCID = GetUserDefaultLCID() 'GEO_NATION 'GEOID of a nation. This value is stored in a long integer Text1(0).Text = GetGeoNation(geoclass, LCID) 'GEO_LATITUDE 'The latitude of the GEOID. This value is stored in a floating point number. Text1(1).Text = GetGeoLatitude(geoclass, LCID) 'GEO_LONGITUDE 'The longitude of the GEOID. This value is stored in a floating point number. Text1(2).Text = GetGeoLongitude(geoclass, LCID) 'GEO_ISO2 'The ISO 2-letter country/region code. This value is stored in a string. Text1(3).Text = GetGeoISO2(geoclass, LCID) 'GEO_ISO3 'The ISO 3-letter country/region code. This value is stored in a string. Text1(4).Text = GetGeoISO3(geoclass, LCID) 'GEO_RFC1766 'An RFC1766-style string derived from the locale and GEOID (for nations only). Text1(5).Text = GetGeoISO3(geoclass, LCID) 'GEO_LCID 'A locale ID (LCID) derived from the language and the GeoID (for nations only). Text1(6).Text = GetGeoLanguageID(geoclass, LCID) 'GEO_FRIENDLYNAME 'The friendly name of the nation. Example: Germany. This value is stored in a string. Text1(7).Text = GetGeoFriendlyName(geoclass, LCID) 'GEO_OFFICIALNAME 'The official name of the nation. Example: Federal Republic of Germany. This value is stored in a string. Text1(8).Text = GetGeoOfficialName(geoclass, LCID) End If 'geoclass End Sub Private Function GetGeoFriendlyName(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_FRIENDLYNAME, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_FRIENDLYNAME, ByVal lpGeoData, cchData, LCID) GetGeoFriendlyName = TrimNull(lpGeoData) End If End Function Private Function GetGeoOfficialName(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 'call once with an empty string; the return 'value indicates the size of the buffer required nRequired = GetGeoInfo(geoclass, GEO_OFFICIALNAME, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_OFFICIALNAME, ByVal lpGeoData, cchData, LCID) GetGeoOfficialName = TrimNull(lpGeoData) End If End Function Private Function GetGeoNation(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_NATION, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_NATION, ByVal lpGeoData, cchData, LCID) GetGeoNation = TrimNull(lpGeoData) End If End Function Private Function GetGeoLatitude(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_LATITUDE, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_LATITUDE, ByVal lpGeoData, cchData, LCID) GetGeoLatitude = TrimNull(lpGeoData) End If End Function Private Function GetGeoLanguageID(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_LCID, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_LCID, ByVal lpGeoData, cchData, LCID) GetGeoLanguageID = Val(TrimNull(lpGeoData)) End If End Function Private Function GetGeoLongitude(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_LONGITUDE, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_LONGITUDE, ByVal lpGeoData, cchData, LCID) GetGeoLongitude = TrimNull(lpGeoData) End If End Function Private Function GetGeoISO2(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_ISO2, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_ISO2, ByVal lpGeoData, cchData, LCID) GetGeoISO2 = TrimNull(lpGeoData) End If End Function Private Function GetGeoISO3(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_ISO3, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_ISO3, ByVal lpGeoData, cchData, LCID) GetGeoISO3 = TrimNull(lpGeoData) End If End Function Private Function GetGeoRFC1766(geoclass As Long, LCID As Long) As String Dim lpGeoData As String Dim cchData As Long Dim nRequired As Long lpGeoData = "" cchData = 0 nRequired = GetGeoInfo(geoclass, GEO_RFC1766, ByVal lpGeoData, cchData, LCID) If (nRequired > 0) Then lpGeoData = Space$(nRequired) cchData = nRequired Call GetGeoInfo(geoclass, GEO_RFC1766, ByVal lpGeoData, cchData, LCID) GetGeoRFC1766 = TrimNull(lpGeoData) End If End Function Private Function TrimNull(startstr As String) As String TrimNull = Left$(startstr, lstrlenW(StrPtr(startstr))) End Function |
Comments |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |