Boa noite pessoal. Como é comum, estou novamente com meus probleminhas.
Tenho uma aplicação pronta e que está funcionando corretamente. Porém, na empresa que utilizo, vai migrar todas as estações de trabalho para Windows Vista ou 7 (não está certo qual das 2 versões ainda).
Porém, eu me antecipei e fiz um teste e tive a desagradável surpresa que é o seguinte:
Toda vez que eu rodo a minha aplicação pela primeira vez, o sistema verifica se existe uma chave no registro e caso não abre um formulário de configuração.
Esse formulário deveria criar uma chave no registro do windows e salvar um valor.
Antes funcionava, agora quando mando gravar, não apresenta nenhum erro, porém não cria a chave e muito menos salva o valor. Segue o código abaixo referente ao botão GRAVAR CONFIGURAÇÕES e o código que está em um módulo. ( O CÓDIGO SUBLINHADO SÃO AS LINHAS QUE FAZ A GRAVAÇÃO NO REGISTRO).
CÓDIGO DO BOTÃO GRAVAR CONFIGURAÇÕES
Private Sub cmdGravarConfig_Click()
On Error Resume Next
Dim x, y As Integer
x = 5
y = 5
[u] Call UpdateKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Empresa\SGCC\BdNovo", _
"DbPath", txtConfigBanco.Text, REG_SZ)[/u]
[u] Call UpdateKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Empresa\SGCC\BdAntigo", _
"DbPath", txtConfigBancoAntigo.Text, REG_SZ)[/u]
BancoDeDados.Close
BancoDeDadosAntigo.Close
Set BancoDeDados = OpenDatabase(txtConfigBanco.Text, False, False, ";PWD=" & Trim(Str(x + 4)) & _
Trim(Str(x + 4)) & Trim(Str(x - 4)) & Trim(Str(x - 4)) & Trim(Str(x + 3)) & _
Trim(Str(x + 3)) & Trim(Str(x - 3)) & Trim(Str(x - 3)) & Trim(Str(x + 2)) & _
Trim(Str(x + 2)) & Trim(Str(x - 2)) & Trim(Str(x - 2)) & Trim(Str(x + 1)) & _
Trim(Str(x + 1)) & Trim(Str(x - 1)) & Trim(Str(x - 1)) & Trim(Str(x)) & Trim(Str(x)))
Set BancoDeDadosAntigo = OpenDatabase(txtConfigBancoAntigo.Text, False, False, ";PWD=" & Trim(Str(y + 4)) & _
Trim(Str(y + 4)) & Trim(Str(y - 4)) & Trim(Str(y - 4)) & Trim(Str(y + 3)) & _
Trim(Str(y + 3)) & Trim(Str(y - 3)) & Trim(Str(y - 3)) & Trim(Str(y + 2)) & _
Trim(Str(y + 2)) & Trim(Str(y - 2)) & Trim(Str(y - 2)) & Trim(Str(y + 1)) & _
Trim(Str(y + 1)) & Trim(Str(y - 1)) & Trim(Str(y - 1)) & Trim(Str(y)) & Trim(Str(y)))
MsgBox "Banco de Dados Configurado com sucesso!", vbInformation + vbOKOnly
If frmPrincipalMDI.Visible = True Then
Unload Me
ElseIf frmPrincipalMDI.Visible = False Then
MsgBox "Reinicie o Sistema!", vbInformation + vbOKOnly
End
End If
End Sub
CÓDIGO QUE ESTÁ NO MÓDULO
Option Explicit
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKeyEx Lib "advapi32" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, ByRef lpdwDisposition As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Public Const REG_NONE = 0
Public Const REG_SZ = 1
Public Const REG_EXPAND_SZ = 2
Public Const REG_BINARY = 3
Public Const REG_DWORD = 4
Public Const REG_DWORD_BIG_ENDIAN = 5
Public Const REG_LINK = 6
Public Const REG_MULTI_SZ = 7
Public Const REG_CREATED_NEW_KEY = &H1
Public Const REG_FULL_RESOURCE_DESCRIPTOR = 9
Public Const REG_NOTIFY_CHANGE_ATTRIBUTES = &H2
Public Const REG_NOTIFY_CHANGE_LAST_SET = &H4
Public Const REG_NOTIFY_CHANGE_NAME = &H1
Public Const REG_NOTIFY_CHANGE_SECURITY = &H8
Public Const REG_OPENED_EXISTING_KEY = &H2
Public Const REG_OPTION_BACKUP_RESTORE = 4
Public Const REG_OPTION_CREATE_LINK = 2
Public Const REG_REFRESH_HIVE = &H2
Public Const REG_OPTION_NON_VOLATILE = 0
Public Const READ_CONTROL = &H20000
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY
Public Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY
Public Const KEY_EXECUTE = KEY_READ
Public Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
KEY_NOTIFY + KEY_CREATE_LINK
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const ERROR_NONE = 0
Public Const ERROR_BADKEY = 2
Public Const ERROR_ACCESS_DENIED = 8
Public Const ERROR_SUCCESS = 0
Public Function UpdateKey(KeyRoot As Long, KeyName As String, SubKeyName As String, SubKeyValue As String, KeyValueType As Long) As Boolean
Dim rc As Long
Dim hKey As Long
Dim hDepth As Long
Dim lpAttr As SECURITY_ATTRIBUTES
lpAttr.nLength = 50
lpAttr.lpSecurityDescriptor = 0
lpAttr.bInheritHandle = True
rc = RegCreateKeyEx(KeyRoot, KeyName, _
0, KeyValueType, _
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, _
hKey, hDepth)
If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError
If (SubKeyValue = "") Then SubKeyValue = " "
rc = RegSetValueEx(hKey, SubKeyName, _
0, KeyValueType, _
SubKeyValue, LenB(StrConv(SubKeyValue, vbFromUnicode)))
If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError
rc = RegCloseKey(hKey)
UpdateKey = True
Exit Function
CreateKeyError:
UpdateKey = False
rc = RegCloseKey(hKey)
End Function
Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String) As String
Dim i As Long
Dim rc As Long
Dim hKey As Long
Dim hDepth As Long
Dim sKeyVal As String
Dim lKeyValType As Long
Dim tmpVal As String
Dim KeyValSize As Long
rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey)
If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError
tmpVal = String$(1024, 0)
KeyValSize = 1024
rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
lKeyValType, tmpVal, KeyValSize)
If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError
Select Case lKeyValType
Case REG_SZ, REG_EXPAND_SZ, REG_LINK, REG_MULTI_SZ
tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)
sKeyVal = tmpVal
Case REG_DWORD, REG_DWORD_BIG_ENDIAN
tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)
For i = Len(tmpVal) To 1 Step -1
sKeyVal = sKeyVal + Hex(Asc(Mid(tmpVal, i, 1)))
Next
sKeyVal = Format$("&h" + sKeyVal)
Case REG_BINARY
sKeyVal = tmpVal
End Select
GetKeyValue = sKeyVal
rc = RegCloseKey(hKey)
Exit Function
GetKeyError:
GetKeyValue = vbNullString
rc = RegCloseKey(hKey)
End Function
Pergunta
Alex Mauricio
Boa noite pessoal. Como é comum, estou novamente com meus probleminhas.
Tenho uma aplicação pronta e que está funcionando corretamente. Porém, na empresa que utilizo, vai migrar todas as estações de trabalho para Windows Vista ou 7 (não está certo qual das 2 versões ainda).
Porém, eu me antecipei e fiz um teste e tive a desagradável surpresa que é o seguinte:
Toda vez que eu rodo a minha aplicação pela primeira vez, o sistema verifica se existe uma chave no registro e caso não abre um formulário de configuração.
Esse formulário deveria criar uma chave no registro do windows e salvar um valor.
Antes funcionava, agora quando mando gravar, não apresenta nenhum erro, porém não cria a chave e muito menos salva o valor. Segue o código abaixo referente ao botão GRAVAR CONFIGURAÇÕES e o código que está em um módulo. ( O CÓDIGO SUBLINHADO SÃO AS LINHAS QUE FAZ A GRAVAÇÃO NO REGISTRO).
CÓDIGO DO BOTÃO GRAVAR CONFIGURAÇÕES
CÓDIGO QUE ESTÁ NO MÓDULO Editado por Alex MauricioLink para o comentário
Compartilhar em outros sites
1 resposta 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.