Guia prático de Visual Basic 6.0 para quem ainda precisa manter sistemas legados
A maioria das pessoas que começa a mexer com visual basic vb6 hoje em dia não está seguindo uma tendência. Está tentando um sistema que a empresa não quer abandonar e não tem orçamento para refazer do zero. O problema é que a documentação oficial da Microsoft nem sempre cobre os casos reais que aparecem quando o código roda em produção há quinze anos.
O que é visual basic vb6 e por que ainda existe
VB6 é uma extensão da família Visual Basic lançada pela Microsoft em 1998. É uma linguagem orientada a eventos, baseada em COM, que usa arquivos .vbp como projetos e compila para executáveis nativos de 32 bits. A IDE tem o clássico trio: janela de propriedades, formulários com designer visual e o Editor VB. Isso significa que você pode arrastar um controle, definir suas propriedades na janela lateral e escrever código no evento Click sem pensar muito em arquitetura. O que muitos não sabem é que o VB6 não usa gerência de memória automática como linguagens modernas. Objetos COM são destruídos quando o reference count chega a zero, e isso gera um problema comum: variáveis que parecem "vazadas" porque um objeto mantém referência circular sem que o programador perceba. A solução imediata é zerar explicitamente com Set obj = Nothing nos pontos de saída do formulário.
Instalação e configuração do ambiente
O VB6 roda nativamente no Windows XP, 7 e 8. No Windows 10 e 11, ele precisa de patches de compatibilidade. Os arquivos essenciais são o vb6.exe, o msdbgrid.ocx, o comdlg32.ocx e os runtime do VB6 que vêm no vbrun60sp6.exe. Se você tentar rodar sem o service pack 6 instalado, vai encontrar erros estranhos de tipagem de dados e problemas com a função DateValue que converte datas DD/MM/YYYY incorretamente em certas regionalizações. Para instalações limpas, o procedimiento recomendado é: instalar o VB6 Enterprise Edition (ou Professional, dependendo do que você precisa), aplicar o SP6 imediatamente, e depois configurar o registro para registrar os componentes COM manualmente com regsvr32 se alguns OCXs não forem encontrados pelo sistema.
Workaround para um problema específico que eu encontrei
Eu mantive durante anos um sistema de estoque que usava o controle DBGrid para exibir dados de uma tabela Access via DAO. Em uma atualização do Windows, o DBGrid parou de mostrar os dados corretamente e iniciava com campos vazios mesmo quando a consulta retornava registros. O motivo era uma mudança na forma como o Windows registrava os type libraries do DAO 3.6 após certain cumulative updates. A solução que funcionou foi adicionar uma referência explícita ao arquivo dao360.dll dentro do menu Project > References, e não confiar na referência automática que o VB6 criava por padrão. Depois disso, o controle passou a reconhecer o recordset corretamente. Também desativei a opção "Remove Information About Unused ActiveX Controls" nas opções do projeto, porque ela às vezes removia type libraries necessários para o DBGrid funcionar.
Conexão com banco de dados: ADO versus DAO
O VB6 suporta tanto ADO quanto DAO. A diferença prática é enorme. DAO funciona bem com arquivos Access (.mdb) e é mais rápido para operações simples, mas não lida bem com bancos SQL Server ou Oracle a partir de certas versões. ADO é mais flexível, suporta ConnectionString para múltiplos provedores e é o caminho recomendado se você precisa conectar a um SQL Server ou até a um arquivo Excel. Um erro comum em projetos novos é criar a conexão assim:
Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\estoque.mdb" Isso funciona em máquinas de 32 bits, mas quebra em qualquer sistema onde o driver Jet não estiver instalado ou onde o arquivo estiver em uma rede com caminhos longos. O fix é usar caminhos relativos ou variáveis de ambiente, e preferencialmente migrar a string de conexão para um arquivo .ini ou para o registro do Windows.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Distribuindo aplicações VB6 para máquinas sem o IDE instalado
O VB6 vem com o Package and Deployment Wizard, mas ele é notoriamente inconsistente. Ele gera um setup que muitas vezes esquece de registrar um OCX ou instala uma versão errada de uma DLL. A abordagem que eu uso é criar um instalador customizado com o Nullsoft Scriptable Install System (NSIS) ou similar, copiando os arquivos necessários manualmente e usando um script para registrar todos os OCXs com regsvr32 /s antes de executar o executável principal. Os arquivos obrigatórios para distribuição são: vbrun60sp6.exe (runtime), o exe do projeto, todas as dlls e ocx referenciadas, e os arquivos de dados se houver. Se você estiver usando o MSFlexGrid, certifique-se de copiar também o mshflxgd.ocx.
Pegadinhas que ninguém conta
O VB6 trata strings comovariantes de tipo BSTR internamente. Isso significa que passar uma string entre módulos pode ter um custo de performance significativo em loops apertados, especialmente se a string for grande. Para relatórios que processam milhares de linhas, converter dados para arrays numéricos e trabalhar com eles evita gargalos que parecem mágica negra quando você não conhece o motivo. Outro problema recorrente é a função DoEvents. Ela é útil para não travar a interface durante operações longas, mas cada chamada a DoEvents permite que outros eventos sejam processados, o que pode causar execuções duplas de botões e efeitos colaterais imprevisíveis. Em projetos que eu vi, substituir DoEvents por timers com status flags eliminou bugs que levavam dias para serem rastreados.
O controle CommonDialog também tem um bug conhecido: em certas configurações do Windows, a caixa de diálogo de impressão não respeita as margens definidas pelo usuário e imprime com escala incorreta. O workaround é usar o API SendMessage com as constantes EM_SETMARGINS diretamente no controle RtfBox ou evitar o CommonDialog para impressão e usar o método PrintForm do próprio formulário.
Migração e alternativas
Se o objetivo é manter o código funcionando sem refazer tudo, existem ferramentas de migração para VB.NET que convertem cerca de 70 a 80 por cento do código automaticamente. O resto precisa de ajuste manual, especialmente partes que usam API calls do Windows ou manipulação direta de memória. A migração completa não é trivial e depende muito de quão dependente o sistema é de componentes COM de terceiros que podem não ter equivalente em .NET. Para novos projetos, não faz sentido usar VB6. A linguagem não recebe atualizações de segurança desde 2008, não roda em ARM64, e não tem suporte a linguagens modernas como async/await ou type inference. O custo de manter um desenvolvedor VB6 hoje é alto porque o pool de profissionais está diminuindo.
Downloads e recursos
O VB6 não está mais disponível para download oficial pela Microsoft. O que existe são arquivos de instalação que foram disponibilizados pela comunidade e que incluem o service pack 6 e os patches de segurança pós-EOL. Para o runtime, o vbrun60sp6.exe pode ser encontrado nos repositórios da Microsoft Archive. Para o IDE completo, os arquivos de instalação originais costumam estar em fóruns especializados como VBForums, onde há threads dedicadas a recuperação de mídia antiga. Documentação técnica ainda acessível: a Microsoft Docs arquivou o conteúdo do VB6 em seu site de archive. A referência de objetos COM, os exemplos de código e a documentação dos controles padrão estão disponíveis como PDFs baixáveis.
Manutenção de código legado: o que funciona na prática
Se você herdou um sistema VB6 e precisa fazer manutenção, a primeira coisa a entender é a estrutura de pastas. Cada projeto .vbp tem um arquivo .frm para cada formulário, .cls para classes, .bas para módulos e .ctl para controles customizados. Manter esses arquivos organizados e documentar quais OCXs cada módulo usa evita dor de cabeça quando alguém precisa compilar em outra máquina. Uma prática útil é criar um módulo bas_global.bas com funções utilitárias centralizadas: abrida de conexão, closure, log de erros, e validação de entradas. Assim, se você precisar mudar o provedor de banco de dados ou ajustar o formato de data, faz em um único ponto em vez de procurar em dezenas de formulários.
O versionamento de código também merece atenção. O VB6 não tem integração nativa com SVN ou Git, mas você pode usar scripts batch para fazer backup periódico dos arquivos do projeto antes de qualquer modificação significativa. Um script simples que copia a pasta do projeto para uma subpasta com data no nome já resolve problemas de regressão em projetos pequenos.