Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Errori run-time delle funzioni API del registro....

Riposto una domanda che ho messo qualche giorno fa.......credo lunedì.....
ho bisogno di usare la funzione API RegSetValueEx per scrivere nel registro
un valore binario....
Ho fatto:
Dim Valore as Long
Valore=65
MsgBox RegSetValueEx(hCurKey, "BarSize", 0, REG_BINARY, ByVal Valore,
Len(Valore) + 1)
Il Msgbox qui sopra mi dà come valore di ritorno 998: cosa vuol dire?
Dove posso reperire l'elenco dei codici per capire dove è il problema?
Se avesse ritornato 0, vuol dire che è andato tutto bene, invece nisba!!!
Inoltre, sapete dirmi in alternativa dove sbaglio con il codice qui
sopra?!?!!
Praticamente devo scrivere il numero 65 in formato binario......nel registro
si deve leggere:
41 00 00 00 00 00 00 00
Grazie a tutti, e good coding almeno a voi!!!!
--
Damiani Liborio Igor
idam...@hotmail.com
 - 
igor.d...@light.it
http://www.igordamiani.it
ICQ : 11847262

per la cronaca........
gli errori sono definiti dentro il file winerror.h (distribuito con Visual
C++)
per scrivere un valore binario bisogna fare:
Dim Valore As String
Valore = Chr(&H41) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) &
Chr(&H0) & Chr(&H0)
RegSetValueEx hCurKey, "BarSize", 0, REG_BINARY, ByVal Valore, Len(Valore)
ovviamente BarSize deve essere il nome della chiave da creare.....
buon lavoro!!!!


 41 00 00 00 00 00 00 00
[cut]
Ciao Igor,
da MSDN - System Error - Numerical Order
998 = Invalid Access to Memory Location
Io, su un sistema WinNT uso una classe, CRegistry,
di cui allego un estratto che spero essere comprensibile:
...
Private Type SECURITY_ATTRIBUTES
	nLength              As Long
	lpSecurityDescriptor As Long
        bInheritHandle       As Boolean
End Type
...
Private Const KEY_ALL_ACCESS = &H3F
...
Private Const REG_OPTION_NON_VOLATILE = 0&
...
Public Enum ERegistryClassConstants
	HKEY_CLASSES_ROOT = &H80000000
	HKEY_CURRENT_USER = &H80000001
	HKEY_LOCAL_MACHINE = &H80000002
	HKEY_USERS = &H80000003
End Enum
Public Enum ERegistryValueTypes
	REG_NONE = (0)
        REG_SIZE = (1)
        REG_EXPAND_SIZE = (2)
        REG_BINARY = (3)
        REG_DWORD = (4)
        ...
	REG_RESOURCE_REQUIREMENTS_LIST = (10)
End Enum
...
Private Declare Function RegCreateKeyEx Lib "advapi32" 
Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpValueName
As String, ByVal Reserved as long, ByVal dwType As Long, 
szData As Byte, ByVal cbData As Long) As long
Private Declare Function RegSetValueExByte Lib "advapi32" 
Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpSubKey
As String, ByVal Reserved as long,  ByVal lpClass As String,
ByVal dwOptions As Long, ByVal samDesired As Long, 
lpSecuityAttributes As SECURITY_ATTRIBUTES, phkResult As Long,
lpdwDisposition As Long) As long
Private Declare Function RegCloseKey Lib "advapi32" 
(ByVal hKey As Long) As long
Private m_hClassKey      As Long
Private m_sSectionKey    As String
Private m_sValueKey      As String
Private m_vValue         As Variant
Private m_sSetValue      As String
Private m_vDefault       As Variant
Private m_eValueType     As ERegistryValueTypes
...
'Property Set/Let/Get for Private Members goes here
...
Public Property Let Value( ByVal vValue As Variant)
  Dim APIReturnCode       As Long
  Dim SecuityAttributes   As SECURITY_ATTRIBUTES
  Dim hKey                As Long
  Dim lCreate             As Long
  Dim ByteArray()         As Byte
  Dim parmCBData          As Long 
 
  'Open or Create the Key
  APIReturnCode = RegCreateKeyEx(m_hClassKey, m_sSectionKey, 0,
                  "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 
                  SecuityAttributes, hKey, lCreate)
  if APIReturnCode Then
    Err.Raise ...
  else
      Select Case m_eValueRegistryType
           case REG_BINARY
                if (VarType(vValue) = vbArray + vbByte) Then
                   ByteArray = vValue
                   parmCBData = UBound() - LBound() - 1
                   APIReturnCode = RegSetValueExByte(hKey, 
                                   m_sValueKey, 0&, REG_BINARY, 
                                   ByteArray(0), parmCBData)
                else
                   Err.Raise ...
                end if
            Case REG_DWORD, REG_DWORD_BIG_ENDIAN,
REG_DWORD_LITTLE_ENDIAN
                 ...
            case ...
                 ...
            case Else
                 ...
        End Select
        RegCloseKey hKey
    End If
End property
Nel codice di un modulo, o di un form,
Private Function MyFunctionStore65()
   Dim ObjRegistry As CRegistry
   ...
   Set ObjRegistry = New CRegistry
   With ObjRegistry
       .ClassKey = HKEY_LOCAL_MACHINE
       .SectionKey = "Software\MyApp\Settings\Bar Settings"
       .ValueKey = "BarSize"
       .ValueType = REG_BINARY
       .Value = CByte(65)
   End With
   ...
End Function
hth
Ciao
	Adriano