VB - Os erros : Out of Stack e Can't Find Installable ISAM
Como toda a linguagem de programação o Visual Basic apresenta erros dos mais variados e nas mais diversas circunstâncias. Não sei se você sabe mas além dos bugs que já foram solucionados existem muitos bugs não resolvidos na linguagem.
Neste artigo vou falar sobre dois erros muito comuns de ocorrerem e que podem tirar o sono de qualquer programador VB se a situação for crítica. Me refiro aos erros :
Vou focar as causas de erros para o ambiente de desenvolvimento com utilização de acesso a base de dados/Exxcel e não garanto a solução definitiva a estes erros pois dependendo do seu ambiente de desenvolvimento e de execução talvez ela não seja aplicável ao seu caso ; estou apenas mostrando os caminhos que você pode seguir para tentar resolver os erros.
Can't Find Installable ISAM
Esta mensagem de erro aparece em diversas situações , geralmente uma combinação das seguintes condições :
1- ) Quando você esta executando duas aplicações VB para banco de dados
A causa deste erro (nesta condição) é que o motor do banco de dados Microsoft Access não esta preparado para apontar para o novo arquivo .INI requerido pela segunda aplicação.
Para contornar este comportamento insira a seção inteira para os Installabe ISAMs do arquivo VB.INI no arquivo <appname>.INI de cada aplicação Visual Basic que tem acesso aos drives ISAM. Esta seção e dada abaixo:
[Installable ISAMs] Btrieve=C:\WINDOWS\SYSTEM\btrv110.dll FoxPro 2.0=C:\WINDOWS\SYSTEM\xbs110.dll FoxPro 2.5=C:\WINDOWS\SYSTEM\xbs110.dll dBASE III=C:\WINDOWS\SYSTEM\xbs110.dll dBASE IV=C:\WINDOWS\SYSTEM\xbs110.dll Paradox 3.X=C:\WINDOWS\SYSTEM\pdx110.dll |
2- Quando você importa dados de um arquivo Microsoft FoxPro, Paradox, dBASE ou Btrieve.
Este erro é causado por uma entrada incorreta no arquivo MSACC20.INI , por um arquivo DLL corrompido ou por uma versão recente do arquivo BTRV200.DLL do Microsoft Access Service Pack usada com a versão original do arquivo MSAJT200.DLL.
Para resolver este problema faça os seguintes passos:
[Installable ISAMs]
Paradox 3.X=C:\Windows\System\Pdx200.dll
Paradox 4.X=C:\Windows\System\Pdx200.dll
FoxPro 2.5=C:\Windows\System\Xbs200.dll
FoxPro 2.6=C:\Windows\System\Xbs200.dll
FoxPro 2.0=C:\Windows\System\Xbs200.dll
dBASE III=C:\Windows\System\Xbs200.dll
dBASE IV=C:\Windows\System\Xbs200.dll
Btrieve=C:\Windows\System\Btrv200.dll
Inicie o Windows Explorer e localize os drivers ISAMs listados no arquivo acima. Se os drivers não forem encontrados no local definido você deverá reinstalar os drivers ISAM. Para fazer isto faça o seguinte :
Em
um editor de textos abra o arquivo MSACC20.INI e
comente a seção ISAM informando um ponto e
vírgula (;) na frente de cada linha.Assim:
[Installable ISAMs]
;Paradox 3.X=C:\Windows\System\Pdx200.dll
;Paradox 4.X=C:\Windows\System\Pdx200.dll
;FoxPro 2.5=C:\Windows\System\Xbs200.dll
;FoxPro 2.6=C:\Windows\System\Xbs200.dll
;FoxPro 2.0=C:\Windows\System\Xbs200.dll
;dBASE III=C:\Windows\System\Xbs200.dll
;dBASE IV=C:\Windows\System\Xbs200.dll
;Btrieve=C:\Windows\System\Btrv200.dll
Nota: Se este erro ocorrer durante operações com o Excel provavelmete os drivers para banco de dados do Excel não estão completamente instalados. Para corrigir o problema nesta condição você deve instalar a correta versão da Microsoft MDAC 2.7. (Para usuários Windows 2000/XP a MDAC já faz parte do sistema operacional.)
3-) Você esta usando objetos de acesso a dados intrínsicos - ADO - DataControl para se conectar a um banco de dados Microsoft Access.
Nesta situação particular esta mensagem de erro ocorre se você esta com a versão incorreta do arquivo MSVBVM60.DLL registrado no seu sistema ou esta distribuindo um versão incorreta com o Package and Deployment Wizard. A versão incorreta da DLL pode ser instalada se você atualizar o seu VB 6.0 com o service Pack 4 ou superior e se a sua versão do arquivo MSVBVM60.DLL é mais recente que a versão do service Pack.
Para resolver o problema tenha certeza de que a versão do arquivo MSVBVM60.DLL é a mesma que é distribuida com o service Pack SP4 para VB6 (que é 6.00.8877 for SP4 e 6.00.8964 para SP5).
Para ter certeza de que a versão correta do arquivo MSVBVM60.DLL esta sendo distribuida , copie o arquivo no diretório :
\Microsoft Visual Studio\VB98\Wizards\PDWizard\Redist
Out of Stack error 28
Este erro significa que houve um estouro de pilha . A pilha é uma área de memória que cresce e encolhe de forma dinãmica com a demanda do seu programa VB .EXE. As possívels causas para este erro são:
Para resolver isto verifique se existem muitos procedimentos aninhados no seu código.(Chamadas recursivas) E certifique-se de que elas terminem de forma efetiva.
Tente declarar algumas variáveis em um módulo. Você pode também declarar todas as variáveis em um procedimento estático informando a palavra chave static antes do nome do seu procedimento.
Strings de tamanho fixo ocupam muito espaço da área de pilha. Tente redefinir algumas de suas variáveis strings para comprimente variável.
Além destes casos existem também os erros de lógica ou de conceituação que você comete a nível de código. Eles ficam ali na sua cara e você não percebe que o problema é aquela inocente chamada a um evento Click do um CheckBox. Quer ver como é verdade ???
- No Visual
Basic crie um novo projeto e no formulário padrão insira dois
controles CheckBox
- A seguir insira o código abaixo no seu formulário.
Private Sub Form_Load() Check1.Value = Checked Show End Sub Private Sub Check1_Click() Check1.Value = Checked Check2.Value = Unchecked End Sub Private Sub Check2_Click() Check1.Value = Unchecked Check2.Value = Checked End Sub |
Execute o projeto e ele vai rodar sem problemas . Agora clique no
segundo Checkbox . Adivinha o que vai acontecer? Veja o resultado
abaixo:
Mas por que ???
Elementar , meu caro Watson ... Ao clicar no segundo ChecKBox você vai entrar em um loop recursivo infinito e isto vai estourar a pilha do sistema.
O código correto que deveria esta no formulário deveria ser :(ou o correto seria usar o controle radioButton ???)
Private
Sub Form_Load() Check1.Value = Checked Show End Sub Private Sub Check1_Click() If Check1.Value = Checked Then Check2.Value = Unchecked End If End Sub Private Sub Check2_Click() If Check2.Value = Checked Then Check1.Value = Unchecked End If End Sub |
Se o código que causou este erro estivesse no meio das 2000 linhas de código do seu programa talvez não fosse tão fácil descobrir o erro , não é mesmo...
E ponto final. Até mais ver ...
José Carlos Macoratti