Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Ricardo Goncalves

[Resolvido] Ler valor de Ficheiro INI

Mensagens Recomendadas

Ricardo Goncalves

Boas,

Estou a tentar ler um valor de um campo num ficheiro INI mas está-me a gerar um erro e não percebo o que estará errado.

Aqui está o codigo que uso para gravar e ler o INI

Module Module1
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationname As String, ByVal lpKeyName As String, ByVal lsString As String, ByVal lplFilename As String) As Long
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationname As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Check As String
Public Function Carrega(Section As String, Key As String) As String
 Dim lngResult As Long
 Dim strFileName
 Dim strResult As String = Space(300)
 strFileName = My.Application.Info.DirectoryPath & "\settings.ini"
 lngResult = GetPrivateProfileString(Section, Key, strFileName, strResult, Len(strResult), strFileName)
 Check = My.Application.Info.DirectoryPath & "\sets.ini"
 Carrega = Trim(strResult)
End Function
Public Function Grava(Section As String, Key As String, Content As String)
 Dim lngResult As Long
 Dim strFileName
 strFileName = My.Application.Info.DirectoryPath & "\settings.ini"
 lngResult = WritePrivateProfileString(Section, Key, Content, strFileName)
End Function
End Module

Na gravação está tudo ok, mas quando tento ler o que foi gravado retorna o seguinte erro:

Additional information: Uma chamada para a função PInvoke 'Teste INI!Teste_INI.Module1::GetPrivateProfileString' desequilibrou a pilha. É provável que a assinatura gerida PInvoke não corresponda à assinatura de destino não gerida. Verifique se a convenção de chamada e os parâmetros da assinatura PInvoke correspondem à assinatura de destino não gerida.

desde já muito obrigado.

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ricardo Goncalves

Boas,

Já resolvi (teve que ser sozinho que o pessoal com o calor deve de estar na praia :thumbsup: )

Segue codigo corrigido para quem precisar

Module Module1
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationname As String, ByVal lpKeyName As String, ByVal lsString As String, ByVal lplFilename As String) As Long
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (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
Public Check As String
Public Function Carrega(ByVal Section As String, Key As String, strFileName As String) As String
 Dim strResult As String = Space$(300)
 strFileName = My.Application.Info.DirectoryPath & "\settings.ini"
 Dim lngResult As Long = GetPrivateProfileString(Section, Key, strFileName, strResult, Len(strResult), strFileName)
 'Check = My.Application.Info.DirectoryPath & "\sets.ini"
 Carrega = Left$(strResult, lngResult)
End Function
Public Function Grava(Section As String, Key As String, Content As String)
 Dim strFileName = My.Application.Info.DirectoryPath & "\settings.ini"
 Dim lngResult As Long = WritePrivateProfileString(Section, Key, Content, strFileName)
End Function
End Module

Já agora comando para gravar:

Grava("Section", "Label", "" & TextBox1.Text & "")

e para ler:

Label1.Text = Carrega("Section", "Label", "")

Se usarem não se esqueçam de agradecer ;) .

Editado por Ricardo Goncalves

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

Tás a programar em vb.net ou vb6? ....

Só te quero dar umas sugestões...

usa

<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function GetPrivateProfileString(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
End Function

<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function WritePrivateProfileString(ByVal lpAppName As String, _
					ByVal lpKeyName As String, _
					ByVal lpString As String, _
					ByVal lpFileName As String) As Boolean
End Function

se usares Winforms usa

Application.StartupPath

em vez de

 My.Application.Info.DirectoryPath

Não mistures tipos de dados... mete

Option Strict On

e

Option Explicit On

para te ajudar, por exemplo aí no valor de retorno da

GetPrivateProfileString

é Int32 e estás a guardar num Long, que irá dar sempre neste caso, mas não mistures tipos de dados, só se precisares mesmo de Long.

Essas funções de vb também deverias tentar substituílas...

Space$

e

Left$

na minha opinião.

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.