INCOMPATIBILIDADE COM WINDOWS X64

ADILSOO 03/03/2016 08:26:22
#458535
Bom dia!
Tenho uma planilha que montei com VBA, nela, tem um modulo que le um arquivo INI, montei em 32bits, mas quando vou rodar no X64, me diz que tem incompatibilidade e precisa atualizar o código para x64. Sera que tem algum modo de corrigir isso?

 Declare Function GetPrivateProfileString Lib [Ô]kernel32[Ô] Alias [Ô]GetPrivateProfileStringA[Ô] (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nsize As Long, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib [Ô]kernel32[Ô] Alias [Ô]WritePrivateProfileStringA[Ô] (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long


Desde ja, muito obrigado pela ajuda de todos.
Abraços!
MARCELOKROL 03/03/2016 08:56:34
#458536
Já experimentou configurar o modo de compatibilidade para o programa?
ADILSOO 03/03/2016 13:46:10
#458575
O programa é uma planilha feita em VBA, nesse caso não tem a opção, porém, no meu computador que é também x64, não aparece, achei estranho, fui executar em 2 computadores com x64 e não funcionou, apareceu o erro..
Na foto está um exemplo do erro...

Pensei que poderia ser alguma referencia, mas não tem nenhuma adicionada...

Link da imagem: CLIQUE AQUI PARA VER A IMAGEM DO ERRO
ADILSOO 03/03/2016 23:45:30
#458612
Alguém?
KERPLUNK 04/03/2016 00:27:41
#458615
Resposta escolhida
Declare assim as suas chamadas API:

Declare PtrSafe Function WriteProfileString Lib [Ô]kernel32[Ô] Alias [Ô]WriteProfileStringA[Ô] (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long

Declare PtrSafe Function GetPrivateProfileString Lib [Ô]kernel32[Ô] Alias [Ô]GetPrivateProfileStringA[Ô] (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long


ADILSOO 04/03/2016 07:34:50
#458623
Bom dia!
Atualizei o codigo, mas nao sei porque, ele agora esta pedindo para declarar uma variavel que ja esta declarada.
Ele esta dando o erro na hora de escrever o INI, o meu codigo e esse... Eu uso esse codigo dentro de um modulo...

 Declare PtrSafe Function WriteProfileString Lib [Ô]kernel32[Ô] Alias [Ô]WriteProfileStringA[Ô] (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
Declare PtrSafe Function GetPrivateProfileString Lib [Ô]kernel32[Ô] Alias [Ô]GetPrivateProfileStringA[Ô] (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Public Function ReadINI(Secao As String, Entrada As String, Arquivo As String)
[ô]Arquivo=nome do arquivo ini
[ô]Secao=O que esta entre []
[ô]Entrada=nome do que se encontra antes do sinal de igual
Dim retlen As String
Dim Ret As String
Ret = String$(255, 0)
retlen = GetPrivateProfileString(Secao, Entrada, [Ô][Ô], Ret, Len(Ret), Arquivo)
Ret = Left$(Ret, retlen)
ReadINI = Ret
End Function

Public Sub WriteINI(Secao As String, Entrada As String, Texto As String, Arquivo As String)
[ô]Arquivo=nome do arquivo ini
[ô]Secao=O que esta entre []
[ô]Entrada=nome do que se encontra antes do sinal de igual
[ô]texto= valor que vem depois do igual
WritePrivateProfileString Secao, Entrada, Texto, Arquivo
[ô]WritePrivateProfileString Secao, Entrada, Texto, Arquivo
End Sub



Tem uma imagem que tirei um print, para ver CLIQUE AQUI
KERPLUNK 04/03/2016 08:55:25
#458624
Leia bem as declarações da API. Leia bem o que você está chamando no seu método INI. Leia com atenção...
ADILSOO 04/03/2016 11:38:21
#458631
Cara, me desculpa, cometi um erro, foi mancada minha... somente o
 PtrSafe  
que adicionou antes, já resolveu, mas não sei porque o motivo, eu tinha trocado os nomes. Mas deu certo.
Agora, se não for pedir muito, poderia por favor, me explicar o que faz esse comando?
Obrigado pela atenção.
JOERBETH 04/03/2016 12:16:30
#458635
Fonte MSDN;

PtrSafe <palavra-chave>
Office 2013 and later
A palavra-chave PtrSafe é usada neste contexto:
Instrução Declare
Observação
As instruções Declare com a palavra-chave PtrSafe é a sintaxe recomendada. As instruções Declare que incluem PtrSafe só funcionarão corretamente no ambiente de desenvolvimento do VBA7 nas plataformas 32 bits e de 64 bits depois que todos os tipos de dados na instrução Declare (parâmetros e valores de retorno) que precisam armazenar quantidades de 64 bits forem atualizados para usar LongLong para integrais de 64 bits ou LongPtr para ponteiros e manipulações. Para garantir a compatibilidade com versões anteriores com o VBA, a versão 6 e anteriores usam a seguinte construção:
VBA
#If Vba7 Then
Declare PtrSafe Sub...
#Else
Declare Sub...
#EndIf
Ao executar versões de 64 bits do Office, as instruções Declare deverão incluir a palavra-chave PtrSafe.
A palavra-chave PtrSafe declara que uma instrução Declare é segura para ser executada em ambientes de desenvolvimento de 64 bits.
A adição da palavra-chave PtrSafe a uma instrução Declare só significa que a instrução Declare se destina explicitamente a 64 bits, todos os tipos de dados na instrução que precisam armazenar 64 bits (incluindo valores e parâmetros de retorno) ainda devem ser modificados para conterem quantidades de 64 bits usando LongLong para integrais de 64 bits ou LongPtr para ponteiros e manipuladores.
Tópico encerrado , respostas não são mais permitidas