none
[VB2005]關於GetPrivateProfileString使用問題? RRS feed

  • 問題


  • 請問一下各位先進前輩,

    Sub GetIniSetting()

         Dim dOffset(4) as Double
         Dim iAxisNo as Integer
         Dim sBuff as String

         SBuff = New String(CChar(""),256)
        
         For iAxisNo = 1 To 4
         Call GetPrivateProfileString("KeyName1","x" & CStr(iAxisNo),"Error",SBuff,256,PathName)
         dOffset(iAxisNo) = CDbl(Mid(sBuff,1,Instr(1,Sbuff,vbNullChar)-1))

         Next i

         SBuff = Nothing

    end Sub

    這段函式中,將由PathName所指定之INI檔讀取數值至dOffset()中分別存放
    假設INI檔內有4個值
    [KeyName1]
    X1 = -7.15
    X2 = 4.25
    X3 = 98.31
    X4 = 87.998

    程式執行呼函式後,iAxisNo = 1時,使用API函式呼叫值為-7.15
    而後iAxisNo=2時,讀到之值就皆為"Error"了,
    想請問這段語法是否為從VB6.0昇級後有需要作更改或是不對之地方,
    請不吝指教m(-_-)m
    2007年10月22日 上午 04:26

解答

  • 因為 API 有檔案大小 64 kb 限制,所以我自己這部分一開始就是用 VBNET 重新包裝。

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=17

    2007年10月22日 上午 07:19
    版主
  •  

    HI  A SIR :

     

    我剛剛是了你的CODE   可以讀到 所有的值    請看下圖

     

     

    下面的程式碼給你參考 ︿︿

     

    程式碼區塊

    Public Class Form1

        Private Sub Form1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click
            Call GetIniSetting()

        End Sub

        Sub GetIniSetting()

            Dim dOffset(4) As Double
            Dim iAxisNo As Integer
            Dim sBuff As String

            SBuff = New String(CChar(""), 256)

            For iAxisNo = 1 To 4

                Call GetPrivateProfileString("KeyName1", "x" & CStr(iAxisNo), "Error", sBuff, 256, "c:\test.ini")

     

            sBuff = sBuff.Trim()

     

            dOffset(iAxisNo) = CDbl(Mid(sBuff, 1, InStr(1, sBuff, vbNullChar) - 1))

            Next iAxisNo

            SBuff = Nothing

        End Sub

    #Region "API Calls"
        ' standard API declarations for INI access
        ' changing only "As Long" to "As Int32" (As Integer would work also)
        Private Declare Unicode Function WritePrivateProfileString Lib "kernel32" _
        Alias "WritePrivateProfileStringW" (ByVal lpApplicationName As String, _
        ByVal lpKeyName As String, ByVal lpString As String, _
        ByVal lpFileName As String) As Int32

        Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" _
        Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String, _
        ByVal lpKeyName As String, ByVal lpDefault As String, _
        ByVal lpReturnedString As String, ByVal nSize As Int32, _
        ByVal lpFileName As String) As Int32
    #End Region

    End Class

     

     

     

     

    2007年10月22日 上午 08:29

所有回覆

  • 因為 API 有檔案大小 64 kb 限制,所以我自己這部分一開始就是用 VBNET 重新包裝。

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=17

    2007年10月22日 上午 07:19
    版主
  • 感謝您的回覆

    這邊的話還有一個問題喔

    該.INI檔的大小確認後為小於1KB,應該沒有超過檔案限制,

    所以關於讀取錯誤之問題能否請您在回覆呢?

    麻煩了
    2007年10月22日 上午 07:32
  • 隱含的意思就是我根本就沒測這個 API 。

    2007年10月22日 上午 07:36
    版主
  •  

    HI  A SIR :

     

    我剛剛是了你的CODE   可以讀到 所有的值    請看下圖

     

     

    下面的程式碼給你參考 ︿︿

     

    程式碼區塊

    Public Class Form1

        Private Sub Form1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click
            Call GetIniSetting()

        End Sub

        Sub GetIniSetting()

            Dim dOffset(4) As Double
            Dim iAxisNo As Integer
            Dim sBuff As String

            SBuff = New String(CChar(""), 256)

            For iAxisNo = 1 To 4

                Call GetPrivateProfileString("KeyName1", "x" & CStr(iAxisNo), "Error", sBuff, 256, "c:\test.ini")

     

            sBuff = sBuff.Trim()

     

            dOffset(iAxisNo) = CDbl(Mid(sBuff, 1, InStr(1, sBuff, vbNullChar) - 1))

            Next iAxisNo

            SBuff = Nothing

        End Sub

    #Region "API Calls"
        ' standard API declarations for INI access
        ' changing only "As Long" to "As Int32" (As Integer would work also)
        Private Declare Unicode Function WritePrivateProfileString Lib "kernel32" _
        Alias "WritePrivateProfileStringW" (ByVal lpApplicationName As String, _
        ByVal lpKeyName As String, ByVal lpString As String, _
        ByVal lpFileName As String) As Int32

        Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" _
        Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String, _
        ByVal lpKeyName As String, ByVal lpDefault As String, _
        ByVal lpReturnedString As String, ByVal nSize As Int32, _
        ByVal lpFileName As String) As Int32
    #End Region

    End Class

     

     

     

     

    2007年10月22日 上午 08:29