Announcement

Collapse
No announcement yet.

GetPrivateProfileStringA liest nur win.ini aus

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GetPrivateProfileStringA liest nur win.ini aus

    Ich habe folgenden Problem:

    Ich nutze VB.Net 2008 und möchte aus einer INI-Datei lesen.
    Leider bekomme ich es nicht hin, das die API-Funktion GetPrivateProfileStringA meine INI-Datei ausliest, sondern immer nur die win.ini

    Hier mein Code:
    Code:
    Private Declare Function GetPrivateProfileStringA Lib "kernel32.dll" (ByVal lpSection As String,  _
                                                                          ByVal lpSetting As String,  _
                                                                          ByVal lpDefault As String,  _
                                                                          ByVal lpReturnedString As String, _
                                                                          ByVal nSize As Long,  _
                                                                          ByVal lpFileName As String) As Integer
    
    Sub Main()
       console.writeline(IniRead("System", "Version", "NIX"))
    End Sub
    
    Function IniRead(ByVal Section As String, ByVal Key As String,  _
                     Optional ByVal Default1 As String = "", Optional ByVal IniFile As String = "") As String
     
           Dim sb As New String(Chr(32), 255)
            Dim n As Integer
    
            n = GetPrivateProfileStringA(Section, Key, Default1, sb, sb.length, "C:\Dokumente und Einstellungen\Admin\Desktop\VB\DOBBC.ini")
            IniRead = Left(sb, n)
    End Function

    Das Programm ignoriert wie gesagt meine eigene Ini-Datei die so aussieht:
    Code:
    [System]
    Version=1.0

    Wenn ich die Daten aus meiner INI-Datei in die Win.ini einfüge, dann werden diese korrekt ausgelesen ...
    Ich weiß nun nicht mehr weiter
    _________________

  • #2
    Warum arbeitest du mit einer ini Datei und nicht mit einer XML Datei als Speicher für Einstellungen? Nur ein kleiner Anstoß ob das nicht einfacher wäre.

    Zu deinem Problem kann ich leider nichts sagen da ich keinen Fehler sehen kann
    Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

    Comment


    • #3
      Wie du am besten die WinAPI Methoden einbindet findest du bei PInvoke.net.

      Das Hauptproblem wird sein das du für den lpReturnedString Parameter einen String nimmst. String ist in .NET ein Immutable Type. Heißt Strings sind unveränderlich. Jede Manipulation eines Strings erzeugt einen neuen String und nicht einen veränderten Originalstring. Somit kannst du keinen, wenn du gegen die WinAPI arbeitest, String Typ als Outparameter verwenden weil man da nichts reinschreiben kann. Du mußt StringBuilder verwenden. Scheinst du auch zu irgendeinen Zeitpunkt mal gemacht zu haben da deine Variable vielsagend sb heißt

      Zweitens solltest du nicht die ANSI Version der API Methode importieren(die mit A am Ende). .NET ist ein durchgängiges Unicode System. Eine ANSI Methode wirkt da als Fremdkörper. Du solltest die Entscheidung welche Version benötigt wird dem System überlassen, das weiß meist genauer was es braucht. Also weder versuchen die A Version noch die W Version zu importieren sondern einfach GetPrivateProfileString.

      Comment


      • #4
        @Ralf: Hmmm. ich bekomme ja Werte zurückgeliefert, an dem Typ von lpReturnedString kann es dann nach meiner Meinung nach nicht liegen....
        Nur bekomme ich nur die Win.ini ausgelesen und keine andere INI-Datei, die ich in lpFileName angebe.

        @das-d: Der Benutzer soll hin und wiedr die Daten selbst anpassen. Und ich denke, das eine INI-Datei einfacher zu verstehen ist als eine XML-Datei.
        Es ist doch nur eine kleine Konsolenanwendung, die eigentlich ohne einen Dateneditor (für dieXML-Daten) auskommen sollte.


        @All
        Und ich komme programmiertechnisch aus einer Zeit, wo MD gerade die INI-Dateien eingeführt hat, die Registry war noch nicht wirklich in Sicht und von dem ausgeblähten XML wusste mal noch nicht.
        Als ich das Programmieren gelernt habe, lautete das Motto nicht "Think big", sondern "think smaller and faster" und programmiere bitte in Assembler.
        OK, die Apple II-Zeiten sind vorbei ..... *schnief*
        Aber ich möchte mit dem einfachsten auskommen und das sind hier meiner Meinung nach die INI-Dateien.


        EDIT:
        Mit diesem Code aus pinvoke klappt alles so wie gewünscht. Nur habe ich noch nicht ganz verstanden warum. Declare Auto??? (werde mal in der Hilfe schauen). Ich hatte schon vermutet das es evtl. an inkompatible Datentypen liegenn könnte, denn die Win-Api ist ja wohl in C geschrieben und erwartet andere Stringformate als Basic (VB.Net) sie liefert. Oder nutzt VB.Net auch Null-Terminierte Strings?

        Code:
        Imports System.Runtime.InteropServices
        Imports System.Text
        Module1
            Private Declare Auto Function GetPrivateProfileString Lib "kernel32" (ByVal lpAppName As String, _
                        ByVal lpKeyName As String, _
                        ByVal lpDefault As String, _
                        ByVal lpReturnedString As StringBuilder, _
                        ByVal nSize As Integer, _
                        ByVal lpFileName As String) As Integer
        
            Sub Main()
        
            Dim res As Integer
            Dim sb As StringBuilder
        
            sb = New StringBuilder(500)
            res = GetPrivateProfileString("AppName", "KeyName", "", sb, sb.Capacity, "c:\test.ini")
            Console.WriteLine("GetPrivateProfileStirng returned : " & res.ToString())
            Console.WriteLine("KeyName is : " & sb.ToString())
        
            End Sub
        End Module
        Danke
        Zuletzt editiert von EightBitWitch; 24.03.2009, 08:33.

        Comment


        • #5
          ja ich weiß nicht ob eine ini datei einfacher zu verstehen ist. Xml Dateien können auch sehr einfach zu verstehen sein und sind mit .Net auch sehr performant zu lesen.

          Ist aber schön zu hören dass es nun funktioniert hat.
          Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

          Comment

          Working...
          X