Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - c# problema con GetPrivateProfileString
Forum - C# / VB.NET - c# problema con GetPrivateProfileString

Avatar
andrea993 (Member)
Rookie


Messaggi: 21
Iscritto: 19/01/2011

Segnala al moderatore
Postato alle 21:35
Giovedì, 28/04/2011
Ho creato questa classe che dovrebbe leggermi valori dai file ini ma non fuzniona, per qualche strano motivo che sembra vadi oltre l'implementazione.

Codice sorgente - presumibilmente C#

  1. namespace INI
  2. {
  3.     public class INI_reader
  4.     {
  5.        [DllImport("kernel32.dll")]
  6.        static extern uint GetPrivateProfileString(
  7.      string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);
  8.  
  9.         public static string leggichiave(string sezione,string key, string file)
  10.         {
  11.             StringBuilder sb = new StringBuilder(500);
  12.             GetPrivateProfileString(sezione, key, "ERRORE", sb, (uint)sb.Capacity, file);
  13.             return sb.ToString ();
  14.         }
  15.        
  16.      }
  17.        
  18.      
  19. }



Qualcuno di voi sa dove potrebbe essere il problema?
Grazie mille in anticipo per il supporto...

PM
Avatar
Phil93 (Normal User)
Pro


Messaggi: 85
Iscritto: 26/01/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 22:29
Giovedì, 28/04/2011
Nella dichiarazione dell'API dichiara lpReturnedString come String, e nella funzione leggichiave usa come buffer una stringa di tanti spazi quanta è la dimensione del buffer. Tempo fa ho fatto una classe in VB.NET per leggere gli INI e così funziona.

Inoltre non sarebbe male se tu leggessi il valore di ritorno di GetPrivateProfileString, così da sapere il codice dell'errore che si verifica.

Dichiarazione API:
Codice sorgente - presumibilmente VB.NET

  1. Private Declare Auto Function GetPrivateProfileString Lib "kernel32.dll" ( _
  2.             ByVal lpApplicationName As String, _
  3.             ByVal lpKeyName As String, _
  4.             ByVal lpDefault As String, _
  5.             ByVal lpReturnedString As String, _
  6.             ByVal nSize As Integer, _
  7.             ByVal lpFileName As String) As Integer



Metodo per ottenere un dato valore:
Codice sorgente - presumibilmente VB.NET

  1. Public Function GetValue(ByVal section As String, ByVal key As String) As String
  2.         If (section <> "" And key <> "") And (section IsNot Nothing And key IsNot Nothing) Then
  3.             ' Stringa di n spazi usata come buffer.
  4.             Dim Result As String = Space(_BufferSize)  
  5.             Dim ResultLength As Integer
  6.  
  7.             ResultLength = GetPrivateProfileString(section, key, _DefaultResult, Result, Result.Length, _FileName)
  8.  
  9.             If ResultLength = 0 Then
  10.                 Throw Err.GetException
  11.             End If
  12.  
  13.             Return Result.Trim
  14.         Else
  15.             Throw New ArgumentException("Parameters cannot be null")
  16.             Return Nothing
  17.         End If
  18.     End Function



Ribadisco che a me così funziona perfettamente. Prova.

Ultima modifica effettuata da Phil93 il 29/04/2011 alle 17:26
si ma come faccio se è un buffer? a farglielo riempire? se gli passo la strnga e basta lui non fa niente - andrea993 - 28/04/11 23:04
Funziona comunque. Se vuoi un buffer di una dimensione n, basta che passi una stringa di n spazi. Edito il messaggio e ti posto il codice della classe che ho creato io. E' in VB.NET ma non dovrebbe essere un problema. - Phil93 - 29/04/11 17:22
PM