|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Locale/Regionalization Routines GetGeoInfo: Obtaining Country List by Enumerating GeoIDs |
|
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. |
|
EnumSystemGeoID
returns a listing of the GeoIDs that are available on the system. By
passing each retrieved GeoID to GetGeoInfo - specifically the
GetGeoFriendlyName wrapper - we can obtain a pretty substantial listing
of world countries. My system returned 260. Because this demo implements an enumeration routine a BAS module is required. The GEO APIs require Windows ME, XP or Server 2003.
|
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. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'working var Public LCID As Long 'SYSGEOTYPE Private Const GEO_FRIENDLYNAME As Long = &H8 'SYSGEOCLASS Public Const GEOCLASS_NATION As Long = 16 'only valid GeoClass value Public Declare Function GetUserDefaultLCID Lib "Kernel32" () 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 Public 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 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 .AddItem GetGeoFriendlyName(geoid, LCID) End With 'return 1 to continue enumeration EnumGeoInfoProc = 1 End Function 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 'call once with an empty string; the return 'value indicates the size of the buffer required 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 TrimNull(startstr As String) As String TrimNull = Left$(startstr, lstrlenW(StrPtr(startstr))) End Function |
|
Form Code |
All that is required on the form is a listbox (List1) and two lines of code: |
|
Option Explicit Private Sub Form_Load() LCID = GetUserDefaultLCID() Call EnumSystemGeoID(GEOCLASS_NATION, 0&, AddressOf EnumGeoInfoProc) End Sub |
Comments |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |