Essa semana, tive esse problema depois de instalar o SP1 do Windows 7 no computador que uso para trabalhar. Como acredito que muitos que ainda utilizam o Visual Basic 6 devem estar sofrendo bastante com isso, criei esse tópico com a solução. Acredito que pode ser resolvido em 100% das vezes, mas talvez com alguns transtornos.
Que problema exatamente é esse?? No primeiro semestre de 2011, a Microsoft liberou o Service Pack 1 do Windows 7 com varias atualizações e correções de bugs e algumas novidades e etc.
Entretanto o novo SP1 trouxe um sério problema para quem estiver usando as bibliotecas ADO do Microsoft Data Access Components (MDAC): um software compilado no Windows 7 SP1 e que use alguma biblioteca ADODB só vai funcionar obrigatoriamente no Windows 7 SP1 e em nenhum outro Windows mais antigo, nem mesmo na versao inicial do Windows 7 (sem o SP1).
Uma tentativa de inicialização de algum objeto das bibliotecas ADODB - Microsoft ActiveX Data Objects (ADODB.Connection, ADODB.RecordSet, etc) resultará em uma mensagem de erro como:
"Class does not support Automation or does not support expected interface"
"Procedure declaration does not match description of event or procedure having the same name."
Por que isso acontece?? Simplesmente porque o SP1 do Windows 7 traz uma atualizacao no componente MDAC (ao qual pertencem as bibliotecas ADODB) que simplesmente não traz mais compatibilidade com os sistemas antigos.
Na verdade a única compatibilidade que existe é entre o Windows 7 SP1 e o Windows Server 2008 R2 SP1, softwares compilados e distribuidos entres esses sistemas operacionais devem funcionar sem problemas.
Bom, por conta deste problema, tem gente que prefere nem instalar o SP1 no computador onde desenvolve os softwares. Realmente, se o computador é usado exclusivamente para desenvolvimento em Visual Basic 6 não faz muita diferença atualizar o sistema. Aliás, pode até trazer transtornos, como é o caso.
Na verdade, eu mesmo recomendo que você compile os seus softwares VB6 em Windows XP para minimizar a possibilidade de problemas na hora da distribuição para outros sistemas, caso não queira fazer uma versão pra cada sistema, o que nem sempre é viavel.
Mas isso não vem ao caso no momento. Caso queira desenvolver softwares em Visual Basic 6 (ou mesmo no Visual C++ ou em .NET utilizando o ADO do MDAC) no Windows 7 Service Pack 1 ou no Windows Server 2008 R2 Service Pack 1, utilize um dos seguintes métodos pra se livrar do problema:
SOLUÇÃO 1:
Instancie os objetos das bibliotecas ADODB somente por Late Biding. O que significa isso?? Veja o seguinte exemplo:
Usando Early Binding (não funciona):
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection[/code]
Usando Late Binding (funciona):
[code]Dim cn
Set cn = CreateObject("ADODB.Connection")
O segundo código instancia o objeto corretamente e não é afetado pelo problema da compatibilidade do SP1. Por que isso ocorre?? Simplesmente porque o segundo código utiliza a funcao CreateObject() que, a partir de uma String que identifique o objeto, vai procurar no sistema o objeto indicado e vai instanciar exatamente aquele que for encontrado no sistema. Ou seja, não importa qual seja a versao da biblioteca, ele conseguirá instanciar e você poderá utilizar normalmente.
Quanto ao primeiro método, o early biding, o programa tentará instanciar exatamente o objeto que está sendo apontando como referência pelo projeto. Isso significa que se você está usando a biblioteca ADO do Windows 7 SP1, depois de compilado, o programa, quando executado, tentará procurar exatamente por essa mesma biblioteca nessa mesma versao ou em uma compátivel. Como a biblioteca do ADO de Windows 7 SP1 não é compátivel com as antigas, ocorrerá o erro.
Usando o late biding, então, ele conseguirá alocar a biblioteca não importa qual a versão. Só é necessário que ela exista no sistema. Não é necessário nem adicionar a referência ao projeto e pode ser até melhor que você não o faça mesmo. Mais sobre late e early biding aqui: http://www.macoratti.net/vbbind.htm
Entretanto, esse método pode te trazer o grande transtorno de ter que alterar o código de um ou vários projetos que você já tenha pronto. Além do mais, isso não seria exatamente uma solução do problema e sim um contorno. Desse modo você estará sempre preso a restrição de não poder usar early biding.
Mas existem outros métodos mais eficazes:
SOLUÇÃO 2:
A Microsoft disponibilizou uma biblioteca compatível com os sistemas antigos, você só precisa baixá-la e instalá-la. Veja o artigo completo aqui: http://support.microsoft.com/kb/2517589/en-us
Veja a lista de arquivos pra download que existe no artigo. Existem três bibliotecas:
- Msado60_Backcompat_i386.tlb -> para sistemas de 32 bits
- Msado60_Backcompat_x64.tlb -> para sistemas de 64 bits usando arquitetura AMD
- Msado60_Backcompat_ia64.tlb -> para sistemas de 64 bits usando arquitetura Intel
O Visual Basic 6 é um software de 32 bits e compila seus programas também para 32 bits. Sendo assim, imagino que, mesmo num sistema de 64 bits, você só necessite da biblioteca de 32 bits, entretanto não fiz nenhum teste sem a biblioteca de 64 bits. Imagino que as de 64 sejam para caso você vá desenvolver em outros softwares compatíveis com 64 bits, como Visual C++, etc, mas por via das dúvidas, recomendo que instale também.
No artigo da Microsoft, eles dão um passo a passo, mas farei uma pequena explicação aqui:
Caso você esteja usando um sistema de 32 bits: faça o download da Msado60_Backcompat_i386.tlb, salve-a no diretório "%CommonProgramFiles%\System\ado\", e renomeie-a para msado60_Backcompat.tlb.
Caso você esteja usando um sistema de 64 bits: faça o download da Msado60_Backcompat_i386.tlb, salve-a no diretório "%CommonProgramFiles(x86)%\System\ado\", e renomeie-a para msado60_Backcompat.tlb.
Depois, faça o download da Msado60_Backcompat_x64.tlb (caso utilize processador AMD) ou da Msado60_Backcompat_ia64.tlb (caso utilize processador Intel), salve-a no diretório "%CommonProgramFiles%\System\ado\" e renomeie-a para msado60_Backcompat.tlb.
Depois do download, você precisa registrar a biblioteca usando o programa regtlibv12.exe do .NET Framework. O caminho do local onde se encontra o arquivo, varia de acordo com a versão do .NET Framework que você possui. No artigo, a Microsoft indica o caminho %windir%\Microsoft.NET\Framework\v4.0.30319\, e caso você esteja utilizando o Windows 7 SP1, muito possivelmente você esteja com essa versão mesmo. Se não for o caso, procureo regtlibv12.exe nas subpastas do diretório %windir%\Microsoft.NET\Framework\, muito possivelmente você encontre esse arquivo numa pasta referente a uma versão mais antiga do framework.
Depois, de localizar o arquivo, clique no menu Iniciar, e na caixa de texto na parte de baixo do menu, onde diz "Pesquisar programas e arquivos", digite as instruções abaixo,
NOTA: se as instrucoes abaixo não funcionarem, pode também ser problema de permissão. De qualquer modo, acho q pra ter certeza de que deu tudo certo, o melhor é executar do prompt de comando, como administrador. Clique em menu Iniciar -> Todos os Programas -> Acessórios, então clique com o botão direito em Prompt de Comando e selecione a opção Executar como Administrador.
Digite então as linhas:
e aperte ENTER.
Se ele não mostrar nenhuma mensagem de erro, significa que o registro deu certo.
Agora, pra fazer funcionar o seu programa, abra o seu projeto no Visual Basic. Clique em menu Project -> References....
Remova qualquer referência que exista para Microsoft ActiveX Data Objects X.Y Library (onde X.Y é o número da versão) e adicione a referência Microsoft ActiveX Data Objects 6.0 BackCompat Library:
Depois disso é só programar normalmente. Você deve conseguir compilar seu programa normalmente, que deve funcionar em sistemas mais antigos sem problemas, como você sempre fez. O único transtorno é a nova biblioteca que pode incomodar um pouco na hora de transportar o .vbp para outros computadores.
SOLUÇÃO 3:
Você pode usar uma biblioteca Microsoft ActiveX Data Objects de um sistema antigo (de preferência de um Windows 7 sem o SP1) e substituir a do SP1 por essa.
Essa foi minha primeira tentativa, mas estava tendo problemas para desregistrar a dll do SP1 e acabei encontrando o artigo a microsoft e fiz da forma acima.
Depois disso, acabei encontrando por aí uma explicação melhor de como trocar as bibliotecas: http://blogs.technet.com/b/asiasupp/archiv...ice-pack-1.aspx
Caso você tenha acesso a qualquer outro computador sem o Windows 7 SP1, então,você pode copiar o arquivo msado28.tlb (da biblioteca Microsoft ActiveX Data Objects 2.8 Library) desse sistema antigo, e substituir o msado28.tlb do SP1 por esse. Então o Visual Basic deve voltar a se comportar como antes com o ADODB, resolvendo o problema de compatibilidade do SP1.
Só o que temos que fazer é desinstalar a biblioteca do SP1 e instalar a antiga. Mas antes disso é necessário conseguir permissão do sistema para fazê-lo
Não cheguei a testar o método, mas, de acordo com as isntruções do link acima, abra o regedit (clique em menu Iniciar, e na caixa de texto na parte de baixo do menu, onde diz "Pesquisar programas e arquivos", digite regedit e pressione ENTER) e acesse a chave HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\TypeLib\{2A75196C-D9EB-4129-B803-931327F72D5C}.
Clique com o botão direito sobre {2A75196C-D9EB-4129-B803-931327F72D5C}, selecione Permissões... -> Avançadas -> Proprietário e, na tabela onde diz Alterar o proprietário para:, selecione o Administrador e clique em OK e em OK novamente:
Isso deve dar permissão para desinstalar o msado28.tlb do SP1. Para isso, precisamos do regtlibv12.exe. Execute a seguinte linha no menu Iniciar, na caixa de texto na parte de baixo do menu, onde diz "Pesquisar programas e arquivos" ou no prompt de comando:
Se tiver problemas com regtlibv12.exe, leia o trecho em que escrevi sobre isso no Método 2 acima.
Depois disso, copie o msado28.tlb do sistema antigo que você possui, em alguma pasta no seu sistema operacional e use o regtlibv12.exe para registrá-la:
onde {caminho} é o endereço do diretório onde você salvou o arquivo.
Depois disso, você pode utilizar os objetos do ADO normalmente, pela referência à biblioteca Microsoft ActiveX Data Objects 2.8 Library.
Esse método parece ser o que funciona melhor, mas não cheguei mesmo a testar. Se alguém testar, poste aí os comentários.
OUTRAS SOLUÇÕES:
Essas três de cima devem ser as soluções mais comuns para o problema. Mas devem existir outros métodos. No prórpio link que passei para a solução 3, o cara deu mais algumas alternativas.
De qualquer modo, se você não gostar de nenhuma das soluções que passei e quiser tentar de outras formas, dêem umas lidas nesses links:
Pergunta
kuroi
Essa semana, tive esse problema depois de instalar o SP1 do Windows 7 no computador que uso para trabalhar. Como acredito que muitos que ainda utilizam o Visual Basic 6 devem estar sofrendo bastante com isso, criei esse tópico com a solução. Acredito que pode ser resolvido em 100% das vezes, mas talvez com alguns transtornos.
Que problema exatamente é esse?? No primeiro semestre de 2011, a Microsoft liberou o Service Pack 1 do Windows 7 com varias atualizações e correções de bugs e algumas novidades e etc.
Entretanto o novo SP1 trouxe um sério problema para quem estiver usando as bibliotecas ADO do Microsoft Data Access Components (MDAC): um software compilado no Windows 7 SP1 e que use alguma biblioteca ADODB só vai funcionar obrigatoriamente no Windows 7 SP1 e em nenhum outro Windows mais antigo, nem mesmo na versao inicial do Windows 7 (sem o SP1).
Uma tentativa de inicialização de algum objeto das bibliotecas ADODB - Microsoft ActiveX Data Objects (ADODB.Connection, ADODB.RecordSet, etc) resultará em uma mensagem de erro como:
"Class does not support Automation or does not support expected interface"
"Procedure declaration does not match description of event or procedure having the same name."
Por que isso acontece?? Simplesmente porque o SP1 do Windows 7 traz uma atualizacao no componente MDAC (ao qual pertencem as bibliotecas ADODB) que simplesmente não traz mais compatibilidade com os sistemas antigos.
Na verdade a única compatibilidade que existe é entre o Windows 7 SP1 e o Windows Server 2008 R2 SP1, softwares compilados e distribuidos entres esses sistemas operacionais devem funcionar sem problemas.
Bom, por conta deste problema, tem gente que prefere nem instalar o SP1 no computador onde desenvolve os softwares. Realmente, se o computador é usado exclusivamente para desenvolvimento em Visual Basic 6 não faz muita diferença atualizar o sistema. Aliás, pode até trazer transtornos, como é o caso.
Na verdade, eu mesmo recomendo que você compile os seus softwares VB6 em Windows XP para minimizar a possibilidade de problemas na hora da distribuição para outros sistemas, caso não queira fazer uma versão pra cada sistema, o que nem sempre é viavel.
Mas isso não vem ao caso no momento. Caso queira desenvolver softwares em Visual Basic 6 (ou mesmo no Visual C++ ou em .NET utilizando o ADO do MDAC) no Windows 7 Service Pack 1 ou no Windows Server 2008 R2 Service Pack 1, utilize um dos seguintes métodos pra se livrar do problema:
SOLUÇÃO 1:
Instancie os objetos das bibliotecas ADODB somente por Late Biding. O que significa isso?? Veja o seguinte exemplo:
Usando Early Binding (não funciona):
O segundo código instancia o objeto corretamente e não é afetado pelo problema da compatibilidade do SP1. Por que isso ocorre?? Simplesmente porque o segundo código utiliza a funcao CreateObject() que, a partir de uma String que identifique o objeto, vai procurar no sistema o objeto indicado e vai instanciar exatamente aquele que for encontrado no sistema. Ou seja, não importa qual seja a versao da biblioteca, ele conseguirá instanciar e você poderá utilizar normalmente. Quanto ao primeiro método, o early biding, o programa tentará instanciar exatamente o objeto que está sendo apontando como referência pelo projeto. Isso significa que se você está usando a biblioteca ADO do Windows 7 SP1, depois de compilado, o programa, quando executado, tentará procurar exatamente por essa mesma biblioteca nessa mesma versao ou em uma compátivel. Como a biblioteca do ADO de Windows 7 SP1 não é compátivel com as antigas, ocorrerá o erro. Usando o late biding, então, ele conseguirá alocar a biblioteca não importa qual a versão. Só é necessário que ela exista no sistema. Não é necessário nem adicionar a referência ao projeto e pode ser até melhor que você não o faça mesmo. Mais sobre late e early biding aqui: http://www.macoratti.net/vbbind.htm Entretanto, esse método pode te trazer o grande transtorno de ter que alterar o código de um ou vários projetos que você já tenha pronto. Além do mais, isso não seria exatamente uma solução do problema e sim um contorno. Desse modo você estará sempre preso a restrição de não poder usar early biding. Mas existem outros métodos mais eficazes: SOLUÇÃO 2: A Microsoft disponibilizou uma biblioteca compatível com os sistemas antigos, você só precisa baixá-la e instalá-la. Veja o artigo completo aqui: http://support.microsoft.com/kb/2517589/en-us Veja a lista de arquivos pra download que existe no artigo. Existem três bibliotecas: - Msado60_Backcompat_i386.tlb -> para sistemas de 32 bits - Msado60_Backcompat_x64.tlb -> para sistemas de 64 bits usando arquitetura AMD - Msado60_Backcompat_ia64.tlb -> para sistemas de 64 bits usando arquitetura Intel O Visual Basic 6 é um software de 32 bits e compila seus programas também para 32 bits. Sendo assim, imagino que, mesmo num sistema de 64 bits, você só necessite da biblioteca de 32 bits, entretanto não fiz nenhum teste sem a biblioteca de 64 bits. Imagino que as de 64 sejam para caso você vá desenvolver em outros softwares compatíveis com 64 bits, como Visual C++, etc, mas por via das dúvidas, recomendo que instale também. No artigo da Microsoft, eles dão um passo a passo, mas farei uma pequena explicação aqui: Caso você esteja usando um sistema de 32 bits: faça o download da Msado60_Backcompat_i386.tlb, salve-a no diretório "%CommonProgramFiles%\System\ado\", e renomeie-a para msado60_Backcompat.tlb. Caso você esteja usando um sistema de 64 bits: faça o download da Msado60_Backcompat_i386.tlb, salve-a no diretório "%CommonProgramFiles(x86)%\System\ado\", e renomeie-a para msado60_Backcompat.tlb. Depois, faça o download da Msado60_Backcompat_x64.tlb (caso utilize processador AMD) ou da Msado60_Backcompat_ia64.tlb (caso utilize processador Intel), salve-a no diretório "%CommonProgramFiles%\System\ado\" e renomeie-a para msado60_Backcompat.tlb. Depois do download, você precisa registrar a biblioteca usando o programa regtlibv12.exe do .NET Framework. O caminho do local onde se encontra o arquivo, varia de acordo com a versão do .NET Framework que você possui. No artigo, a Microsoft indica o caminho %windir%\Microsoft.NET\Framework\v4.0.30319\, e caso você esteja utilizando o Windows 7 SP1, muito possivelmente você esteja com essa versão mesmo. Se não for o caso, procureo regtlibv12.exe nas subpastas do diretório %windir%\Microsoft.NET\Framework\, muito possivelmente você encontre esse arquivo numa pasta referente a uma versão mais antiga do framework. Depois, de localizar o arquivo, clique no menu Iniciar, e na caixa de texto na parte de baixo do menu, onde diz "Pesquisar programas e arquivos", digite as instruções abaixo, NOTA: se as instrucoes abaixo não funcionarem, pode também ser problema de permissão. De qualquer modo, acho q pra ter certeza de que deu tudo certo, o melhor é executar do prompt de comando, como administrador. Clique em menu Iniciar -> Todos os Programas -> Acessórios, então clique com o botão direito em Prompt de Comando e selecione a opção Executar como Administrador. Digite então as linhas: e aperte ENTER. Se estiver utilizando um sistema de 64 bits, digite também: e aperte ENTER. Se ele não mostrar nenhuma mensagem de erro, significa que o registro deu certo. Agora, pra fazer funcionar o seu programa, abra o seu projeto no Visual Basic. Clique em menu Project -> References.... Remova qualquer referência que exista para Microsoft ActiveX Data Objects X.Y Library (onde X.Y é o número da versão) e adicione a referência Microsoft ActiveX Data Objects 6.0 BackCompat Library: Depois disso é só programar normalmente. Você deve conseguir compilar seu programa normalmente, que deve funcionar em sistemas mais antigos sem problemas, como você sempre fez. O único transtorno é a nova biblioteca que pode incomodar um pouco na hora de transportar o .vbp para outros computadores. SOLUÇÃO 3: Você pode usar uma biblioteca Microsoft ActiveX Data Objects de um sistema antigo (de preferência de um Windows 7 sem o SP1) e substituir a do SP1 por essa. Essa foi minha primeira tentativa, mas estava tendo problemas para desregistrar a dll do SP1 e acabei encontrando o artigo a microsoft e fiz da forma acima. Depois disso, acabei encontrando por aí uma explicação melhor de como trocar as bibliotecas: http://blogs.technet.com/b/asiasupp/archiv...ice-pack-1.aspx Caso você tenha acesso a qualquer outro computador sem o Windows 7 SP1, então,você pode copiar o arquivo msado28.tlb (da biblioteca Microsoft ActiveX Data Objects 2.8 Library) desse sistema antigo, e substituir o msado28.tlb do SP1 por esse. Então o Visual Basic deve voltar a se comportar como antes com o ADODB, resolvendo o problema de compatibilidade do SP1. Só o que temos que fazer é desinstalar a biblioteca do SP1 e instalar a antiga. Mas antes disso é necessário conseguir permissão do sistema para fazê-lo Não cheguei a testar o método, mas, de acordo com as isntruções do link acima, abra o regedit (clique em menu Iniciar, e na caixa de texto na parte de baixo do menu, onde diz "Pesquisar programas e arquivos", digite regedit e pressione ENTER) e acesse a chave HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\TypeLib\{2A75196C-D9EB-4129-B803-931327F72D5C}. Clique com o botão direito sobre {2A75196C-D9EB-4129-B803-931327F72D5C}, selecione Permissões... -> Avançadas -> Proprietário e, na tabela onde diz Alterar o proprietário para:, selecione o Administrador e clique em OK e em OK novamente: Isso deve dar permissão para desinstalar o msado28.tlb do SP1. Para isso, precisamos do regtlibv12.exe. Execute a seguinte linha no menu Iniciar, na caixa de texto na parte de baixo do menu, onde diz "Pesquisar programas e arquivos" ou no prompt de comando: Se tiver problemas com regtlibv12.exe, leia o trecho em que escrevi sobre isso no Método 2 acima. Depois disso, copie o msado28.tlb do sistema antigo que você possui, em alguma pasta no seu sistema operacional e use o regtlibv12.exe para registrá-la:onde {caminho} é o endereço do diretório onde você salvou o arquivo.
Depois disso, você pode utilizar os objetos do ADO normalmente, pela referência à biblioteca Microsoft ActiveX Data Objects 2.8 Library.
Esse método parece ser o que funciona melhor, mas não cheguei mesmo a testar. Se alguém testar, poste aí os comentários.
OUTRAS SOLUÇÕES:
Essas três de cima devem ser as soluções mais comuns para o problema. Mas devem existir outros métodos. No prórpio link que passei para a solução 3, o cara deu mais algumas alternativas.
De qualquer modo, se você não gostar de nenhuma das soluções que passei e quiser tentar de outras formas, dêem umas lidas nesses links:
http://www.vbforums.com/showthread.php?t=643290
http://blogs.technet.com/b/asiasupp/archiv...ice-pack-1.aspx
ou façam mais buscas por aí.
Mas se achar alguma solução nova, não deixe de postar.
Qualquer comentário ou problema que encontrar sobre as soluções descritas aqui, poste aí também.
Editado por kuroiLink para o comentário
Compartilhar em outros sites
14 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.