E POSSIVEL O KERNELL PERDER O PROCEDIMENTO?

USUARIO.EXCLUIDOS 20/04/2007 09:22:37
#212892
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

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
USUARIO.EXCLUIDOS 20/04/2007 22:10:22
#213106
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;
  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)

USUARIO.EXCLUIDOS 20/04/2007 22:57:45
#213111
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.
USUARIO.EXCLUIDOS 21/04/2007 10:52:04
#213121
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.

USUARIO.EXCLUIDOS 21/04/2007 23:30:44
#213193
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.

USUARIO.EXCLUIDOS 23/04/2007 08:18:55
#213280
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

Tópico encerrado , respostas não são mais permitidas