Ir para conteúdo
Fórum Script Brasil
  • 0

Visual Basic 6 no Windows 7 Service Pack 1


kuroi

Pergunta

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:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12 "%CommonProgramFiles%\System\ado\Msado60_Backcompat.tlb"
e aperte ENTER. Se estiver utilizando um sistema de 64 bits, digite também:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12 "%CommonProgramFiles(x86)%\System\ado\Msado60_Backcompat.tlb"
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: backcompat.jpg 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: ado28.jpg 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:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12 -u "%CommonProgramFiles(x86)%\system\ado\msado28.tlb"
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:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12 "{caminho}\msado28.tlb"

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 kuroi
Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0
Só uma pergunta, qual o criador de setup que você está usando? O nativo do visual basic 6 ou um outro?

no meu caso especifico, eu estava compilando o programa e passando somente o .exe para outros computadores onde o MDAC já estava instalado. ou seja, não criei nenhum setup pra distribuicao. mas o .exe compilado usando o MDAC do W7 SP1, já não funciona com as bibliotecas antigas.

mas no caso de você precisar distribuir, o melhor é passar um msado2X.tlb de um sistema mais antigo.

ou seja, recomendo compilar o programa e tb criar o instalador num sistema mais antigo, como o windows xp, é mais garantido q va funcionar.

Link para o comentário
Compartilhar em outros sites

  • 0
Só uma pergunta, qual o criador de setup que você está usando? O nativo do visual basic 6 ou um outro?

no meu caso especifico, eu estava compilando o programa e passando somente o .exe para outros computadores onde o MDAC já estava instalado. ou seja, não criei nenhum setup pra distribuicao. mas o .exe compilado usando o MDAC do W7 SP1, já não funciona com as bibliotecas antigas.

mas no caso de você precisar distribuir, o melhor é passar um msado2X.tlb de um sistema mais antigo.

ou seja, recomendo compilar o programa e tb criar o instalador num sistema mais antigo, como o windows xp, é mais garantido q va funcionar.

Derrepente pode ter sido essa a causa do problema.

Talvez se você criasse um setup com as dependências nas versões que você utiliza, ela seria registrada no pc do cliente.

De vez enquando, eu crio novos setups para meus sistemas, por acumular muitas atualizações como correções de bugs, ou por inserir novos componentes ao projeto. Se eu fosse você eu tentaria criar um novo setup atualizado.

Estou desenvolvendo umas coisas cabeludas aqui, qualquer coisa te falo.

Boa sorte.

Link para o comentário
Compartilhar em outros sites

  • 0

pode ser, mas antes disso é preciso verificar se as bibliotecas do ado do windows 7 sp1 funcionam nos windows antigos.

o crispim postou um tópico aqui de q ele teve problema na distribuicao, então possivelmente essas bibliotecas só vao funcionar no w7 sp1 mesmo.

mas como eu disse, prefiro compilar e criar o instalador dos meus programas no xp mesmo. é quase certo q uma biblioteca do xp vai rodar no 7, mas o contrario tem menor probabilidade de acontecer. e se você tentar instalar uma biblioteca antiga no lugar de uma nova, e optar por manter a versao mais nova (o q é recomendado), é bem provavel q funcione do mesmo jeito.

ou seja, é menor a probabilidade de erros.

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, criando um Instalador com as novas bibliotecas ADODB do Win7 não funcionou comigo...

o que faço é compilar o instalador, mas substituo a biblioteca "msado28.tlb" pela "msado15.dll" e tem funcionado...

as referências de utilização que faço são as seguintes:

Dim Con As ADODB.Connection
Set Con = New ADODB.Connection
Con.Open ....


Dim Rs As ADODB.Recordset

Set Rs = New ADODB.Recordset
Rs.CursorLocation = adUseClient
Rs.Open ....

Editado por Danleonhart
Link para o comentário
Compartilhar em outros sites

  • 0

Amigos,

Estou ressuscitando um antigo sistema contabil que eu havia feito e ao abrir o projeto no vb6 com windows xp sp3 estou tendo problemas com o ADO. não esperava que fosse acontecer isso no win xp.

Tenho 2 formularios importantes que usa ADO e ao tentar rodar o projeto acontece o seguinte erro:

Compile-Error: "Procedure declaration doesnt match description of event or procedure having the same name"

Private Sub Adodc_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
    
Adodc.Caption = " Registro: " & Format(Adodc.Recordset.AbsolutePosition, "00000") & " de " & Format(Adodc.Recordset.RecordCount, "00000")

End Sub

O problema não esta no conteudo do procedimento MoveComplete na verdade o projeto não esta aceitando executar este procedimento. Creio que seja algum bug do ADO com o windows xp sp3.

Gostaria de saber se poderia me ajudar a solucionar este problema. Meu MSN é well_nagib@hotmail.com.

abraços

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0
Compile-Error: "Procedure declaration doesnt match description of event or procedure having the same name"

esse erro não deve ter a ver com o assunto do tópico.

isso deve ser algum parametro q esta declarado de modo diferente do prototipo desse evento. tente apagar essa sub e chama-la de novo (selecionando novamento o evento MoveComplete do Adodc) e veja se não funciona.

se não funcionar possivelmente então ta faltando adicionar a referencia ao ADODB.

Link para o comentário
Compartilhar em outros sites

  • 0
Compile-Error: "Procedure declaration doesnt match description of event or procedure having the same name"

esse erro não deve ter a ver com o assunto do tópico.

isso deve ser algum parametro q esta declarado de modo diferente do prototipo desse evento. tente apagar essa sub e chama-la de novo (selecionando novamento o evento MoveComplete do Adodc) e veja se não funciona.

se não funcionar possivelmente então ta faltando adicionar a referencia ao ADODB.

Então kuroi gostaria muito que você me ajudasse com isso.

Pesquisei melhor e vi q o problema esta quando uso como referencia no projeto as bibliotecas do

Microsoft ActiveX Data Objects Library 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7 ou 2.8 e eu usar a versao 2.0

não tenho problemas, mas eu lembro que quando eu estava trabalhando neste projeto ainda no windows

xp sp1 eu lebro que chequei usar o mdac 2.7 e não tive problemas mas no windows xp sp3 estao tendo problemas

se eu tentar usar qualquer versao acima da 2.0. já apaguei a sub e chamei novamente mas não funciona.

você tem alguma outra solução ? já conseguiu simular isso ai? abs

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...