... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$145,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


64 bits - Seus aplicativos no futuro do presente

Costumo oferecer alguns aplicativos em Access pela internet, como o MontaRibbons e tive que superar alguns desafios para fazê-los funcionar nas diversas versões existentes do Windows e do Office.  O mais recente desafio que enfrentei foi o de adaptá-los às versões de 64 bits do Windows 7 e do Office 2010.   A versão de 64 bits do Office 2010 ainda está sendo pouco utilizada no mercado, mas o Windows 7 de 64 bits está se disseminando rapidamente e é por isso que trago neste artigo, as informações necessárias para você preparar os seus projetos, de acordo com as novas adaptações exigidas. 

Windows de 64 bits

O Windows de 64 bits traz um emulador de 32 bits chamado de WOW64 (Windows 32 ON Windows 64), permitindo que qualquer aplicação de 32 bits seja executada, sem problemas.  Para isso, são criados: estrutura de pastas, variáveis de ambientes e registros do Windows independentes.   Observe a tabela abaixo:

Descrição 32 bits (x86) 64 bits (x64)
Pastas do Windows \Windows\sysWoW64 \Windows\System32
  \Program Files (x86) \Program Files
Variáveis de ambientes CommonProgramFiles(x86) CommonProgramFiles
  ProgramFiles(x86) ProgramFiles
Registros do Windows HKEY_LOCAL_MACHINE\Software\ WoW6432Node HKEY_LOCAL_MACHINE\Software

 

 

Devemos ter especial atenção ao nosso código, quando for necessário ter que apontar para algum arquivo numa dessas pastas ou registros do Windows.  Para você compreender melhor, suponha que eu precise criar uma função que indique se o programa compactador WinRar está ou não instalado.

O arquivo Winrar, se for encontrado,  estará na pasta Program Files (86), por se tratar ainda de um programa de 32 bits, mas se futuramente for lançado o Winrar de 64 bits, poderá ser localizado na pasta Program Files.  Tenho que prever esta possível mudança na minha função.  

Usando a janela imediata do VBA , verifico os seguintes resultados:

? dir("c:\program files\winrar\winrar.exe")
Retornou vazio
? dir("c:\program files (x86)\winrar\winrar.exe)
retornou winrar.exe

A pasta pode não estar na unidade c:\ e o que farei neste caso é utilizar a função Environ(), que retornará com o caminho , incluindo a unidade(c,d ,e ...).  Observe os resultados de retorno para o Windows de 64 bits e para o de 32 :

? environ("programfiles")
'No Windows de 64 bits
retornou c:/program files 86 com o Access(2007/2010) de 32 bits
retornou c:/program files com o Access 2010 de 64 bits
'No Windows de 32 bits
retornou c:/program files no Access(2007/2010) de 32 bits

Para verificar a pasta Program files 86 no Access de 64 bits, preciso indicá-la na função environ().

? environ("programfiles(x86)")
'Windows de 64 com Access 2010 de 64
retornou c:\program files 86

Depois de vários testes consigo então elaborar a função que atende a todas as versões do Windows, Office e Winrar.   Observe os comentários :

Public Function fncWinrarExiste() As Boolean
If Len(Dir(Environ("PROGRAMFILES") & "\Winrar\WinRAR.EXE") & "") > 0 Then
   'Windows 32 ou 64 com o Office(2007/2010) de 32 ou 64
   fncWinRarExiste = True
ElseIf Len(Dir(Environ("PROGRAMFILES(x86)") & "\Winrar\WinRAR.EXE") & "") > 0 Then
   'Windows 64 com o Office 2010 de 64, procurando na pasta de 32 bits
   fncWinRarExiste = True
Else
    fncWinRarExiste = False
End If
End Function

Uma outro exemplo:  imagine que eu precise localizar a rota em que o Access está instalado.  É de costume capturarmos esta informação através do registro do Windows.    Sabendo que o Windows de 64 bits armazena as informações dos programas de 32 bits na pasta wow6432node, terei que prever no código, as duas rotas possíveis para o Access (32 bits ou 64). 

Observe os comentários no código abaixo:

Public Function fncLocalAccess(versao) As String
Dim objReg As Object
Dim strlocal As String
Dim pathAcc1 As String
Dim pathAcc2 As String
'--------------------------------------------------------------------------------------
'windows 32 bits com office de 32 bits
'windows 64 bits com office 2010 64 bits
pathAcc1 = "HKEY_LOCAL_MACHINE\Software\Microsoft\office\" & versao & _
"\Access\installRoot\path"
'--------------------------------------------------------------------------------------

'--------------------------------------------------------------------------------------
'windows 64 bits com office de 32 bits
pathAcc2 = "HKEY_LOCAL_MACHINE\Software\wow6432node\Microsoft\office\" & versao & _
"\Access\installRoot\path"
'---------------------------------------------------------------------------------------
Set objReg = CreateObject("wscript.shell")
On Error Resume Next
strlocal = objReg.RegRead(pathAcc1)
If Err Then
    Err.Clear
    strlocal = objReg.RegRead(pathAcc2)
    If Err Then
        strlocal = "Access não encontrado"
    End If
End If
Set objReg = Nothing
fncLocalAccess = strlocal
End Function

Constantes VBA7, WIN64 e a condicional de compilação (#IF)

O VBA nos permite executar determinado conjunto de códigos, em função da versão utilizada, através de estrutura condicional de compilação(#IF).  A constante VBA7 nos permite identificar se está sendo usada a versão 7 do VBA, que pertence ao Access 2010 e a constante Win64 identifica se o Access 2010 é de 64 bits. 

Veja a estrutura abaixo e os comentários.

#If VBA7 Then
   'Área comum do Access 2010 de 32 e 64 bits    #If WIN64 Then       'Área exclusiva do Access 2010 de 64 bits    #Else       'Área exclusiva do Access 2010 de 32 bits
   #End If
#Else
   'Área do Access 2007 e inferiores
#End If

Como exemplo , acompanhe a função abaixo que automatiza a busca de localização da rota do Access 2007 ou a do Access 2010.

Public Function fncPathAccess() As String
#If VBA7 Then
    'Se o aplicativo rodar no Access 2010
    fncPathAccess = fncLocalAccess("14.0")
#Else
    'Se o aplicativo rodar no Access 2007
    fncPathAccess = fncLocalAccess("12.0")
#End If
End Function

Mudanças nas APIs

Todas as APIs utilizadas com o Office 2010 sofreram alterações na sua estrutura para atender a versão de 64 bits.  Foram acrescentados o atributo PtrSafe, na instrução declare e os novos tipos de dados LongLong e LongPtr.

Para o office 2010 de 32 bits a API funciona sem precisar realizar qualquer alteração, porém a Microsoft recomenda que se use com o atributo Ptrsafe:

Declare ptrsafe Function GetActiveWindow Lib "user32" () As Long

Para atender a versão de 64 bits é preciso alterar o tipo long para longPtr que também é aceito no Access 2010 de 32 bits:

Declare ptrsafe Function GetActiveWindow Lib "user32" () As LongPtr

Para adaptar o aplicativo à nova estrutura das APIs, fazemos uso da condicional de compilação #if

Option Compare Database
Option Explicit
 
#If VBA7 Then
   'Área comum do Access 2010 de 32 bits e 64 bits
   Declare ptrsafe Function GetActiveWindow Lib "user32" () As LongPtr
#Else
   'Área do Access 2007 e inferiores
   Declare Function GetActiveWindow Lib "user32" () As Long
#End If

Tem APIs projetadas para rodar apenas na versão de 64 bits do Access 2010.   Acompanhe a alteração na estrutura da condicional de compilação para atender as APIs de 64 bits.

Option Compare Database
Option Explicit
 
#If VBA7 Then
   'Área comum do Access 2010 de 32 bits e 64 bits
   Declare ptrsafe Function GetActiveWindow Lib "user32" () As LongPtr
   #if WIN64 then
      'Área exclusiva do Access 2010 de 64 bits
      Declare PtrSafe Function GetTickCount64 Lib "kernel32" () As LongLong
   #else
      'Área exclusiva do Access 2010 de 32 bits
      Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
   #end if
#Else
   'Área do Access 2007 e inferiores
   Declare Function GetActiveWindow Lib "user32" () As Long
   Declare Function GetTickCount Lib "kernel32" () As Long
#End If

A Microsoft disponibilizou um arquivo txt, contendo uma lista de centenas de APIs modificadas.  Se não encontrar na lista, procure pelo Google.  Baixe aqui o arquivo txt.

Arquivos MDE/ADE/ACCDE

Os Bancos de Dados que tiveram seus códigos fonte removidos (como arquivos .mde, .ade e .accde) não podem ser movidos entre as edições de 32 bits e 64 do Access 2010.

Controles ActiveX e complementos COM

Os controles ActiveX e DLLs de suplementos (COM) que foram escritos para a versão de 32 bits do Office não funcionam no de 64 bits..

Segue alguns Links para você se aprofundar

Bom estudo!


 

 


18 comentários

Silvio   17/10/2010 17:40:21

PO legal Avelino, que bom saber o que nos espera antes mesmo que usemos o Access 2010.
Muita dor de cabeça será poupada e muitas horas sem dormir. Rsrsrsrsr
Valeu mesmo

MARCIO MELO - RJ   01/10/2011 19:42:36

Ótima matéria e serve de alerta, pena que controles ActiveX e DLLs de suplementos (COM) não funcionaram, por exemplo será que vai existir alguma substituição para a MSCOMM32.OCX (activex control) nos permite a conecção na porta COM que nos tempos de hoje também já estão ficando obsoletas, mas existem para efeito de conhecimentos balanças que utilizam desta saída para se comunicar com a CPU, estudos e novos conceitos devem ser bem análisados... o futuro 64 bits já chegou... forte abraço mestre Avelino.

Sou mais Brasil!

Marcos   28/12/2011 18:16:09

Avelino, montei um banco bem forte e estava rodando tranquilo no 2007, 32bits mas não roda no 2010 64bits, poderia ajudar ?
marcosviniciusenator@gmail.com

Avelino Sampaio   02/01/2012 08:35:59

Marcos,

se estiver usando APIs deverá adaptá-las conforme explicado no artigo.

Se tiver usando algum ActiveX, deverá procurar uma outra alternativa pois a maioria dos ActivesX de 32 não funcionam na versão de 64.

Entre no VBA , vá no menu DEPURAR e clique em COMPILAR. Corrija os erros que encontrar

GOOGLE AGENDA   24/05/2012 10:47:53

AVELINO ESTOU COM UM PROBLEMA, USO O ACCESS 2010, E CONSEGUI UM EXEMPLO DE COMO ASSOCIAR VIA VBA O ACCESS COM AS API'S DO GOOGLE, ATRAVES DO INET(MSINET.OCX), O PROBLEMA É QUE USO JUSTAMENTE O 64BITS, E SEMPRE DA UM ERRO DE QUE NAO FOI POSSIVEL CRIAR O OBJETO, NO ENTANTO CONSEGUI UM OUTRO EXEMPLO FEITO EM VISUAL BASIC, QUE USA A MESMA OCX NA MESMA PASTA E FUNCIONA NORMALMENTE, NA VERDADE USA O MESMO CÓDIGO, SÓ QUE NO ACCES NÃO FUNCIONA, TEM ALGUMA IDEIA DE COMO FAZER ISSO FUNCIONAR, ABAIXO SEGUE O LINK DO EXEMPLO
https://dl.dropbox.com/u/66900159/EventosGoogle.mdb

Avelino Sampaio   25/05/2012 06:26:16

Google Agenda,

Acho que a chance de funcionar com o MSINET.OCX são remotas. Vc tem este arquivo ? Ele esta registrado na Pasta c:\windows\syswow64 ?

Tente adaptar o seu projeto, utilizando a DLL msxml.dll

veja no link abaixo o uso desta DLL.

http://comunidade.itlab.com.br/eve/forums?a=search&reqWords=MSXML2.XMLHTTP

Bom estudo!


JEFERSSON   25/05/2012 11:38:03

Era isso que eu temia, rsrsrsrsr
Então fuçando na net encontrei alguma coisa sobre essa dll vou tentar adaptar, e depois posto aqui o resultado, por enquanto agradeço o retorno e a dica.


Isabel Cristina Santana   17/07/2012 21:12:36

Avelino... muito obrigada pelo artigo.. lendo-o consegui resolver um problema que muitos da área não conseguiram, nele descobri que são duas pastas a system32 e a syswow64, nesta segunda que estava o executável que precisava para que eu vinculasse o MSINET.OCX, só assim alguns programas da Receita Federal funcionou no meu pc que é 64bits e windows 7. Abraços.

Sanckler Guelfi   06/11/2012 00:15:51

Instalando o Office 2010 64 bits.....se desenvolver aplicativos, ele irá rodar em 32 bits???

David Vieira Rocha   20/06/2013 16:39:06

Muito grato por ter respondido a solicitação. Como sou novo no ramo ainda estou tendo muitas dificuldades com a linguagem de VBA e Dll's. De qualquer forma vou lhe incomodar bastante...
Antecipo os agradecimentos pela ajuda.

Marcio   25/03/2014 17:42:53

Boa tarde,

Fiz uma macro, onde tem vários "For" encadeados para varrer uma variável do tipo Type e fazer comparações, onde também existem chamadas para funções. Carregando uma variável de saída, também do tipo Type.
Meu problema é que dependendo da quantidade dos dados que carregados nas variáveis (o tamanho dos vetores são suficientes) a saída fica diferente, mas pela lógica, não deveria, já que os dados ainda seriam os mesmos, apenas acrecidos de mais dados. Parecendo que o Excel está descartando parte dos dados por conta própria.
Isso está acontecendo o W7 e com Office 2007 e 2010.

Obrigado pela ajuda

Adriano   31/10/2014 20:18:39

Boa Noite Avelino, td bem?

Excelente matéria. Estou com uma dificuldade gigante por causa do 64 bits, estou tentando usar a Treeview que deveria estar na biblioteca "mscomct2.ocx", porém, já fiz o registro e nada, não aparecem os controles activex para usar. Além da treeview, também não consigo encontrar o activex do calendário.

Vc consegue me ajudar?

Desde já, muito obrigado.

abs,

Avelino Sampaio   01/11/2014 10:49:14

Adriano,

este OCX não funciona na versão de 64 bits.

Lembrando que vc instalar o Office de 32 bits no Windows de 64 bits.

Sucesso!

Adriano   03/11/2014 15:33:31

Obrigado pelo retorno Avelino. Infelizmente, o cliente utiliza o office 64 bits. Vou criar outra forma de exibir os resultados que não seja usando treeview.

abs

Daniel Webster   05/05/2015 08:10:08

Avelino,

Onde no código coloco as instruções das APIs?

Avelino Sampaio   25/09/2015 16:14:39

Daniel,

em um módulo global.

Sucesso!

JESUS VICENTE   12/02/2017 13:30:40

gostaria de saber se é possível acessar no mesmo aplicativo as duas versões 32 ou 64 - tenho feito alguns teste e não consigo, isto é possível???

JESUS VICENTE   04/03/2017 05:02:33

gostaria de saber se é possível acessar no mesmo aplicativo as duas versões 32 ou 64 - tenho feito alguns teste e não consigo, isto é possível???


Envie seu comentário: