2010-04-15 3 views
3

프로덕션 환경에있는 VB6의 응용 프로그램이 있습니다.이 응용 프로그램은 PC의 국가 별 설정을 읽고 있습니다. 하지만 이제는 PC의 설정을 변경하지 않고 응용 프로그램의 다른 국가 별 설정을 지정해야합니다.Visual Basic 6.0 응용 프로그램에서 국가 별 옵션을 어떻게 설정합니까?

영향을 최소화하면서 어떻게 새 국가 별 설정을 전체적으로 설정할 수 있습니까? 어떤 구성 방법 (또는 이와 비슷한)이 있습니까?

+1

나는 그렇게 생각하지 않습니다. 특히 VB6에서 ANSI 컨트롤에 사용하는 비 유니 코드 응용 프로그램의 로캘입니다. – wqw

답변

1

http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_21841979.html

Option Explicit 

Public Enum DateOrderEnum 
    doDefault 'Your locale setting 
    doMDY  'Month-Day-Year (U.S.) 
    doDMY  'Day-Month-Year (EU, S.A.) 
    doYMD  'Year-Month-Day (Japan) 
End Enum 

Public Const LOCALE_SSHORTDATE As Long = &H1F 
Public Const LOCALE_STHOUSAND As Long = &HF 
Public Const LOCALE_SDECIMAL As Long = &HE 

Public Declare Function GetUserDefaultLCID Lib "kernel32"() As Long 
Public Declare Function GetSystemDefaultLCID Lib "kernel32"() As Long 
Public Declare Function GetLocaleInfoA Lib "kernel32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long 

Public Function GetThousandsSep() As String 
    GetThousandsSep = pfGLI(GetUserDefaultLCID(), LOCALE_STHOUSAND) 
End Function 

Public Function GetDecimalSep() As String 
    GetDecimalSep = pfGLI(GetUserDefaultLCID(), LOCALE_SDECIMAL) 
End Function 

'Purpose: Assume a date string with English separator "1/4/2006" 
'Returns: Correct Date Variable 
Public Function ResolveDate(ByVal sDate As String) As Date 
    Dim sArray() As String 
    If InStr(sDate, "/") Then 'Potentially a date string 
     sArray = Split(sDate, "/") 
     Debug.Print "GetUserDefaultLCID", GetUserDefaultLCID 
     Debug.Print "GetSystemDefaultLCID", GetSystemDefaultLCID 
     If UBound(sArray) = 2 Then 'We have 3 parts 
     Select Case ShortDateOrder2 
      Case doMDY ' 
       ResolveDate = DateSerial(sArray(2), sArray(0), sArray(1)) 
      Case doDMY 
       ResolveDate = DateSerial(sArray(2), sArray(1), sArray(0)) 
      Case doYMD 
       ResolveDate = DateSerial(sArray(0), sArray(1), sArray(2)) 
     End Select 
     End If 
    End If 
End Function 

'Purpose: Assume a number string with English separators "123,456.78" 
'Returns: Correct Double Variable 
Public Function ResolveNumber(ByVal sNum As String) As Double 
    Dim sTS As String 
    Dim sDS As String 
    sTS = GetThousandsSep 
    sDS = GetDecimalSep 

    If (sTS = ",") And (sDS = ".") Then 'English 
     'format is OK 
    Else 
     Dim i As Long 
     Dim sMid As String 
     For i = 1 To Len(sNum) 
     Select Case Mid(sNum, i, 1) 
      Case "," 
       Mid(sNum, i, 1) = sTS 
      Case "." 
       Mid(sNum, i, 1) = sDS 
     End Select 
     Next 
    End If 

    ResolveNumber = CDbl(sNum) 

End Function 

Public Function ShortDateOrder2() As DateOrderEnum 
    'Get ShortDateOrder the hard way 
    Dim sShort   As String 
    Dim qOn    As Boolean 
    Dim i    As Integer 
    Dim sChar   As String 

    On Error Resume Next 

    'Get the Short Date format 
    sShort = pfGLI(GetUserDefaultLCID(), LOCALE_SSHORTDATE) 

    For i = 1 To Len(sShort) 
     sChar = Mid(sShort, i, 1) 
     'Ignore items in single quotes (if any) 
     If sChar = "'" Then 
     qOn = Not qOn 
     Else 
     If Not qOn Then 
      Select Case sChar 
       Case "d" 
        ShortDateOrder2 = doDMY 
        Exit Function 
       Case "m" 
        ShortDateOrder2 = doMDY 
        Exit Function 
       Case "y" 
        ShortDateOrder2 = doYMD 
        Exit Function 
      End Select 
     End If 
     End If 
    Next 
End Function 

Private Function pfGLI(ByVal m_LocaleLCID As Long, ByVal reqInfo As Long) As String 
    Dim Buffer As String * 255 
    GetLocaleInfoA m_LocaleLCID, reqInfo, Buffer, 255 
    pfGLI = StripNull(Buffer) 
End Function 

Public Function StripNull(ByVal StrIn As String) As String 
    Dim nul    As Long 
    nul = InStr(StrIn, vbNullChar) 
    Select Case nul 
     Case Is > 1 
     StripNull = Left$(StrIn, nul - 1) 
     Case 1 
     StripNull = "" 
     Case 0 
     StripNull = Trim$(StrIn) 
    End Select 
End Function 
+0

'Select Case sChar'는 'Select Case LCase (sChar)'를 안전한쪽으로 변경하는 것이 좋습니다. 어떻게 생각해? –

0

Dependsing에서 당신이 실제로 달성하기 위해 노력하고 무엇에, 당신은 당신의 시작 절차에 SetThreadLocale()를 호출 시도 할 수 있습니다.