4 messaggi dal 07 aprile 2011
Ciao a tutti,

sono un nuovo membro e pongo subito un post, devo leggere un file .ini con VS2010 e non riesco, mi da un errore: sbilanciamento dello stack
quello che faccio è:

Public Declare AutoFunction GetPrivateProfileString Lib"kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName AsString, _
ByVal lpKeyName AsString, _
ByVal lpDefault AsString, _
ByVal lpReturnedString AsString, _
ByVal nSize AsLong, _
ByVal lpFileName AsString) AsLong

poi in una Public Sub

Dim VG_NomeServer AsString
Dim VL_FileName AsString = ""
Dim VL_ReturnString AsString
Dim VL_NomeServer AsLong

VL_FileName = "NomePercorsoDirectory\NomeFile.INI"
VL_ReturnString = Space$(128)

VL_NomeServer = GetPrivateProfileString("DATABASE", "NomeServer", "NomePercorsoDirectory", VL_ReturnString, 128, VL_FileName)
VG_NomeServer = Trim(UCase(Mid(VL_ReturnString, 1, VL_NomeServer)))

L'errore che mi genera:
GetPrivateProfileString' ha sbilanciato lo stack

Dov'è l'errore??

Grazie a tutti per l'aiuto.
4 messaggi dal 07 aprile 2011
Grazie a tutti per il NON aiuto.

Comunque sono riuscito lo stesso a venirne a capo.

Non immaginavo che il mio post fosse così complesso...
Evidentemente mi sbagliavo.

Chi fosse interessato alla soluzione si faccia avanti.
369 messaggi dal 08 dicembre 2006
Ciao...dunque, come hai fatto?
4 messaggi dal 07 aprile 2011
Allora c'è qualcuno....

Premetto la mia provenienza (ed inesorabile reminiscenza) è VB6, pertanto...

Ecco la soluzione:
Innanzitutto creo una Classe: clsFilesINI

Public Class clsFilesIni

' API
Private Declare Ansi Function GetPrivateProfileString _
Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As System.Text.StringBuilder, _
ByVal nSize As Integer, ByVal lpFileName As String) _
As Integer

Private Declare Ansi Function WritePrivateProfileString _
Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpString As String, _
ByVal lpFileName As String) As Integer

Private Declare Ansi Function GetPrivateProfileInt _
Lib "kernel32.dll" Alias "GetPrivateProfileIntA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal nDefault As Integer, _
ByVal lpFileName As String) As Integer

Private Declare Ansi Function FlushPrivateProfileString _
Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As Integer, _
ByVal lpKeyName As Integer, ByVal lpString As Integer, _
ByVal lpFileName As String) As Integer

Dim strFilename As String

Public Sub New(ByVal Filename As String)
strFilename = Filename
End Sub

' Read-only property
ReadOnly Property FileName() As String
Get
Return strFilename
End Get
End Property

Public Function GetString(ByVal Section As String, ByVal Key As String, ByVal [Default] As String) As String

' Returns a string from your INI file
Dim intCharCount As Integer
Dim objResult As New System.Text.StringBuilder(256)

intCharCount = GetPrivateProfileString(Section, Key, _
[Default], objResult, objResult.Capacity, strFilename)

If intCharCount > 0 Then
GetString = Left(objResult.ToString, intCharCount)
Else
Return Nothing
End If

End Function

Public Function GetInteger(ByVal Section As String, ByVal Key As String, ByVal [Default] As Integer) As Integer

' Returns an integer from your INI file
Return GetPrivateProfileInt(Section, Key, _
[Default], strFilename)

End Function

Public Function GetBoolean(ByVal Section As String, ByVal Key As String, ByVal [Default] As Boolean) As Boolean

' Returns a boolean from your INI file
Return (GetPrivateProfileInt(Section, Key, _
CInt([Default]), strFilename) = 1)

End Function

Public Sub WriteString(ByVal Section As String, ByVal Key As String, ByVal Value As String)

' Writes a string to your INI file
WritePrivateProfileString(Section, Key, Value, strFilename)
Flush()

End Sub

Public Sub WriteInteger(ByVal Section As String, ByVal Key As String, ByVal Value As Integer)

' Writes an integer to your INI file
WriteString(Section, Key, CStr(Value))
Flush()

End Sub

Public Sub WriteBoolean(ByVal Section As String, ByVal Key As String, ByVal Value As Boolean)

' Writes a boolean to your INI file
WriteString(Section, Key, CStr(CInt(Value)))
Flush()

End Sub

Private Sub Flush()

' Stores all the cached changes to your INI file
FlushPrivateProfileString(0, 0, 0, strFilename)

End Sub

End Class


poi in un modulo, chiamo ad esempio la lettura di stringhe:

Public Function IniRead(ByVal FileName As String, ByVal Section As String, ByVal Key As String) As String
Dim objIniFile As New clsFilesIni(FileName)
IniRead = objIniFile.GetString(Section, Key, "<Not_Found>")
End Function

Public Sub IniWrite(ByVal FileName As String, ByVal Section As String, ByVal Key As String, ByVal Value As String)

Dim objIniFile As New clsFilesIni(FileName)

objIniFile.WriteString(Section, Key, Value)

End Sub


Quindi per usarla scrivo:

mioValore=IniRead(PercorsoMioFileIni, MiaSezione, MiaChiave)

ovvero:
[NOMESEZIONE]
Chiave1=pippo

Ecco come richiamare :
MioValore=IniRead(PercorsoMioFileIni, ?NOMESEZIONE?, ?Chiave1?)

Questo è quanto (come esempio 1)
Mi piacerebbe ricevere commenti al riguardo.
Grazie
369 messaggi dal 08 dicembre 2006
interessante, e se come hai detto funziona...lo è ancora di più...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.