Compatibilidade de Aplicações Visual Basic 6.0 no Windows 7
Nos últimos trabalhos realizados para garantir a compatibilidade de aplicações no Windows 7, encontrei uma quantidade significativa de aplicações desenvolvidas em Visual Basic 6.0. O Visual Basic 6.0 apresenta alguns problemas de compatibilidade quando executado no Windows 7.
Os tópicos a seguir descrevem os problemas mais comuns encontrados durante o processo de migração das aplicações do Windows XP para o Windows 7.
1. Acesso Negado
O Process Monitor (PROCMON) é uma boa opção para diagnosticar as atividades do sistema de arquivos, do Registro e de processos e threads em tempo real. Na Figura 1 é possível verificar, através do PROCMON, que o erro de acesso negado ocorre devido à aplicação tentar gravar um arquivo texto no diretório da
aplicação localizado em C:\Program Files (x86) . A partir do Windows Vista, é necessário ter privilégio administrative para realizar modificações por se tratar de um diretório protegido.
Figura 1 - Erro de Acesso Negado
Na maioria dos casos, esse problema ocorre devido o UAC estar desativado (prática não recomendada pela Microsoft). As aplicações VB6 são virtualizadas quando o UAC está habilitado. Consequentemente, com o UAC habilitado, o erro de acesso negado não irá ocorrer quando a aplicação tentar gravar o arquivo no diretório da aplicação, pois essa ação será automaticamente redirecionada (REPARSE) para a pasta VirtualStore localizada em %LOCALAPPDATA%, conforme ilustrado na Figura 2.
Figura 2 - Virtualização de arquivo para aplicações legadas
Para maiores detalhes sobre UAC consulte o artigo Controle de Conta de Usuário (UAC).
2. Permissão Negada
No Windows 7, o uso do método SendKeys gera o erro “Run-tine error '70': Permission denied” quando o UAC está habilitado. A Figura 3 exibe um DUMP coletado, para uma das aplicações diagnosticadas, no momento em que o erro ocorre. Através do DUMP é possível verificar que o erro ocorreu devido ao uso da função SendKeys:
Figura 3 - Permissão Negada devido o uso do método SendKeys
Um dos usos mais frequentes do SendKeys no VB6 é simular a tecla tab, conforme o exemplo a seguir:
Figura 4- Uso do SendKeys
Existem algumas soluções para esse corrigir esse problema sem a necessidade de executar a aplicação com privilégio elevado ou desativar o UAC. Sendo algumas delas:
- Recompilar a aplicação VB6 no Windows 7. Esse problema de incompatibilidade foi corrigido na última versão do runtime do VB6 (MSVBVM60.DLL) que agora utiliza um método interno diferente para realizar a ação. Essa solução corrige o problema de acesso negado do código compilado, entretanto, não elimina o erro durante o debug do código através da IDE do VB6.
- Substituir o SendKeys pela API PostMessage, conforme:
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
SendKeys "{tab}" '13 = Enter Key
PostMessage hwnd, &H100, &HD&, &H1C0001
End If
End Sub
3. Tipo Incompatível
Encontrei esse erro em algumas aplicações VB6. Observando apenas a mensagem de erro fica difícil identificar que o erro de incompatibilidade de dados ocorria devido à falta do runtime do VB5 (que possui como DLL principal a MSVBVM50.DLL)
Figura 5 - Mensagem Run-time error 13 Type mismatch
Em poucos casos a mensagem de erro informava corretamente que o motivo do erro era a falta da MSVBVM50.DLL.
Figura 6 - Mensagem de erro informando que o runtime do VB5 não foi encontrado.
O Process Monitor pode ser utilizado para confirmar que o problema realmente se refere à falta do runtime do VB5.
Figura 7 - Aplicação VB6 que possui dependência do runtime do VB5
O runtime do Visual Basic 5.0 funciona no Windows 7, apesar de não ser mais suportado, e está disponível para download no Centro de Download da Microsoft: https://support.microsoft.com/kb/180071.
4. ConnectionString Incorreta
A seguinte mensagem de erro é exibida quando a aplicação não é executada com privilégio de administrador:
Error: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified Code: 80004005 Source: Microsoft OLE DB Provider for ODBC Drivers
A mensagem equivalente no Windows 7 em português seria: Nome da fonte de dados não encontrado e nenhum driver padrão especificado.
Durante o debug da aplicação foi possível diagnosticar que a ConnectionString utilizada para retornar as informações de conexão estava incorreta, ou seja, retornava apenas o provider da conexão.
Valor retornado |
Valor esperado |
Provider=MSDASQL.1; |
DRIVER=XX;SERVER=XX;DataBase=XX;UID=XX;PWD=XX; |
O motivo do valor da conexão estar truncado ocorre devido um FIX de segurança que foi lançado a partir do Windows Vista. O objetivo do FIX é esconder as informações que expõem a segurança. É necessário adicionar na ConnectionString a informação “PersistSecurity Info=true” para que o ADO entenda que as informações sensíveis (Extended Properties) são necessárias e devem ser mantidas.
Links Úteis
Visual Basic 6.0 Resource Center - https://msdn.microsoft.com/en-us/vstudio/ms788229.aspx
Comments
- Anonymous
January 13, 2015
Consegui resolver o caso obrigado