E POSSIVEL O KERNELL PERDER O PROCEDIMENTO?
Olás!!!!
Até ontem a rotina para ler arquivo INI funcionava perfeitamente em um programa q tenho rodando... desenvolvi um outro programa q tbm irá ler um arquivo ini, até ai tranquilo, fui lá no programa que esta rodando, peguei a rotina, e ai q aconteceu do XP não retornar mais a as informações do arquivo ini, ele retorna certinho o tamanho da string mas a string vem em branco... alguem já pasou por isso ou sabe se existe uma forma de resolver...
segue abaixo os procedimentos:
em um módulo:
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Agora para chamar a function faço assim:
wdatabase = ReadINI("ConexaoDB", "DataBase", App.Path & "\Conexao.ini")
mas ele esta me retornando em branco....
Abraços
Alex
Até ontem a rotina para ler arquivo INI funcionava perfeitamente em um programa q tenho rodando... desenvolvi um outro programa q tbm irá ler um arquivo ini, até ai tranquilo, fui lá no programa que esta rodando, peguei a rotina, e ai q aconteceu do XP não retornar mais a as informações do arquivo ini, ele retorna certinho o tamanho da string mas a string vem em branco... alguem já pasou por isso ou sabe se existe uma forma de resolver...
segue abaixo os procedimentos:
em um módulo:
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Function ReadINI(Section As String, Key As String, filename As String)
Ret = Space$(255)
RetLen = GetPrivateProfileString(Section, Key, "", Ret, Len(Ret), filename)
Ret = Left$(Ret, RetLen) ' aqui o Ret vem os 255 espaços, e o RetLen com o tamanho certinho da string do arquivo ini, ele não esta trazendo a string
ReadINI = Ret
End Function
Agora para chamar a function faço assim:
wdatabase = ReadINI("ConexaoDB", "DataBase", App.Path & "\Conexao.ini")
mas ele esta me retornando em branco....
Abraços
Alex
Alguns pontos a serem revistos (alguns são somente boas práticas básicas na programação):
- Poste o conteúdo do arquivo .ini;
- Force a declaração de variaveis através de Option Explicit;
- Declare o tipo de retorno da função;
- Poste o conteúdo do arquivo .ini;
- Force a declaração de variaveis através de Option Explicit;
- Declare o tipo de retorno da função;
Public Function ReadINI(Section As String, Key As String, filename As String) As String
- Declare (ou poste) o tipo as variáveis Ret e RetLen;
Dim Ret As String
Dim RetLen As Long
- Lembre que APIs na sua maioria são escritas em C. Em C é trivial inicializar/encerrar sequência de caracteres (strings) com zeros binários, portanto, a troque a inicialização de "Ret" por: Ret = String(255, 0)
Public Function ReadINI(Section As String, Key As String, FileName As String)
'Filename=nome do arquivo ini
'section=O que esta entre []
'key=nome do que se encontra antes do sinal de igual
Dim retlen As String
Dim Ret As String
Ret = String$(255, 0)
retlen = GetPrivateProfileString(Section, Key, "", Ret, Len(Ret), FileName)
Ret = Left$(Ret, retlen)
ReadINI = Ret
End Function
Dessa maneira Até hoje nunca tive problemas.
'Filename=nome do arquivo ini
'section=O que esta entre []
'key=nome do que se encontra antes do sinal de igual
Dim retlen As String
Dim Ret As String
Ret = String$(255, 0)
retlen = GetPrivateProfileString(Section, Key, "", Ret, Len(Ret), FileName)
Ret = Left$(Ret, retlen)
ReadINI = Ret
End Function
Dessa maneira Até hoje nunca tive problemas.
NIL,
Me pareceu que ÂÂ'código original é seu.
Conforme comentei sobre alguns pontos "alguns são somente boas práticas básicas na programação".
Assim como "Dim retlen As String" não é uma boa prática já que a função de API GetPrivateProfileString retorna um longo, o correto é "Dim retlen As Long".
Infelizmente o VB aceita essas barbarides e não acusa erro, apenas converte o inteiro longo num número literal, mais fazer o que.
Me pareceu que ÂÂ'código original é seu.
Conforme comentei sobre alguns pontos "alguns são somente boas práticas básicas na programação".
Assim como "Dim retlen As String" não é uma boa prática já que a função de API GetPrivateProfileString retorna um longo, o correto é "Dim retlen As Long".
Infelizmente o VB aceita essas barbarides e não acusa erro, apenas converte o inteiro longo num número literal, mais fazer o que.
Não josé, o código não é de minha autoria, eu copie a uns 4 anos + ou - desde que faço leituras em arquivos INI.
Quanto a suas explicações , foi bom saber, obrigado.
Quanto a suas explicações , foi bom saber, obrigado.
mesmo fazendo os ajustes sugeridos, não tive resultado... essa rotina já funcionavam a muito tempo tbm... em torno de 2 anos, tanto no 98 qto no XP nunca tive problema...
para resolver, fiz a restauração do sistema para o dia anterior... e simplesmente a rotina voltou a funcionar... não achei nenhuma explicação para esse fato...
Abraços
para resolver, fiz a restauração do sistema para o dia anterior... e simplesmente a rotina voltou a funcionar... não achei nenhuma explicação para esse fato...
Abraços
Tópico encerrado , respostas não são mais permitidas