PDA

View Full Version : [C#] Problema GetPrivateProfileString


Andrea993
20-10-2010, 22:09
Ciao a tutti sto programmando una funzione che mi deve leggere il valore di "language" che è "ita" da questo file INI:
[config]
language = ita
version = 2.0

Fatto sta che per qualche motivo l'operazione non va a buon fine!

Questa è la classe contenente solo la funzione:
public class INI_reader
{
[DllImport("kernel32.dll")]
static extern uint GetPrivateProfileString(
string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);

public static string ReadKey(string file_path, string Section, string Key)
{
StringBuilder sb = new StringBuilder(500);
uint res = GetPrivateProfileString(Section, Key, "ERROR", sb, sb.Capacity, file_path);
return sb.ToString();
}
}

Gli passo percorso_file_ini, sezione ("config") e chiave ("language").

Mi viene sempre restituito "ERROR" che indica che l'operazione non è andata a buon fine.

Sapete dov'è il problema??
Grazie mille in anticipo

giangian2
21-10-2010, 07:08
sezione ("config") e chiave ("language").


ciao
non ci vanno le parentesi.

sezione "config" e chiave "language"

Andrea993
21-10-2010, 15:18
sì so era solo per fart capire cosa passo alla funzione!

La funzione la chiamo così:
lingua = INI.INI_reader.ReadKey(Directory.GetCurrentDirectory() + @"\config\config.conf", "config", "version");

giangian2
22-10-2010, 07:19
La funzione "Directory.GetCurrentDirectory()" ritorna la path corrente, ma non è detto che sia quella in cui si trova l'eseguibile.
Se tu crei un collegamento all'eseguibile e nelle proprietà cambi la directory di avvio la funzione "Directory.GetCurrentDirectory()" ritorna la path impostata.
Detto questo in debug (da visual studio) la path è "<path del progetto>\bin\debug" (a meno che non sia stata modificata con Directory.SetCurrentDirectory).

Andrea993
22-10-2010, 15:23
La cartella è quella giusta, ho gia verificato con un breakpoint

giangian2
22-10-2010, 15:57
La cartella è quella giusta, ho gia verificato con un breakpoint

allora non ne ho proprio idea... ho copiato pari pari il tuo pezzo di codice ed ho creato in file come il tuo e da me funziona correttamente.
Prova a modificare l'import della funzione come segue

[DllImport("kernel32.dll", SetLastError=true)]
static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);

poi una volta fatta la chiamata prova a verificare il codice d'errore che ha settato la GetPrivateProfileString chiamando:

Marshal.GetLastWin32Error()

Spero ti possa essere di aiuto.

ciao ciao

Andrea993
02-11-2010, 10:35
Puoi spiegarti meglio che non ho mai usato questa procedura??...grazie mille

Andrea993
02-11-2010, 15:53
Mi dice che il numero dell'errore è 2!

giangian2
03-11-2010, 07:11
Mi dice che il numero dell'errore è 2!

ciao,
da MSDN (http://msdn.microsoft.com/it-it/library/ms681382(v=VS.85).aspx) il codice di errore 2 indica "File non trovato".
Sei sicuro che la path del file impostata da codice sia esattamente la path in cui ha creato il file??

Andrea993
28-04-2011, 16:28
Sì, sicursissimo ho provato anche con altri file ma niente