Page 1 of 1

Leer registros de Windows de tipo REG_MULTI_SZ

Posted: Tue Jun 14, 2011 9:27 pm
by SoftWeb
Hola a todos:

Alguien a leido o trabajado alguna ves con registros de Windows de tipo REG_MULTI_SZ, son unos registros que contiene un array de cadenas separadas por un nulo.
Llevo varios días intentándolo sin éxito.

Saludos

Re: Leer registros de Windows de tipo REG_MULTI_SZ

Posted: Tue Jun 14, 2011 11:57 pm
by Daniel Garcia-Gil
Hola

aqui tienes un ejemplo para leerlo, el ejemplo devuelve un array con las lineas

para agregar un registro de prueba...
Inicie el Editor del Registro (Regedt32.exe).
Busque la siguiente clave del registro:
HKEY_LOCAL_MACHINE\Software

En el menú Edición , haga clic en Agregar clave y, a continuación, agregue el clave Registro siguiente:
Key Name: VfpRegTest

Haga clic en la clave que agregó en el paso 3. En el menú Edición , haga clic en Agregar valor y, a continuación, agregue el siguiente valor:
Value Name: TestREG_MULTI_SZ
Data Type: REG_MULTI_SZ
Value: Line1
Line2
Line3
Line4

asegurate de presionar ENTER despues de cada linea

Code: Select all

#include "fivewin.ch"

#define  HKEY_LOCAL_MACHINE      2147483650        // 0x80000002

function main()

   local nKey    := HKEY_LOCAL_MACHINE
   local cSubKey := "Software\VfpRegTest"
   local cValue  := "TestREG_MULTI_SZ"  
   
   xbrowse( READ_REG_MULTI_SZ( nKey, cSubKey, cValue ) )

return nil

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <hbapiitm.h>

LPSTR LToStr( long w );

static int NULL_tokenCount( const char * szLine, int nLen )
{
   int ul = 0, nTokens = 1;
   
   while( ul < nLen )
   {
      if( szLine[ ul ] == NULL )
      {
         ++nTokens;
         while( ul + 1 < nLen && szLine[ ul + 1 ] == NULL )
            ++ul;
      }
      ++ul;
   }

   return nTokens;
}

static PHB_ITEM NULL_arrayToken( const char * szLine, int nLen )
{
   int ul;
   int nTokens = NULL_tokenCount( szLine, nLen ) - 1;
   PHB_ITEM pArray;
   int nToken, nStart;
   
   pArray = hb_itemArrayNew( nTokens );
   
   if( nTokens > 0 ){
      for( ul = nStart = nToken = 0; ul < nLen; ++ul )
      {
         if( szLine[ ul ] == NULL )
         {
            hb_arraySetCL( pArray, ++nToken, szLine + nStart,  ul - nStart  );
            while( ul + 1 < nLen && szLine[ ul + 1 ] == NULL )
               ++ul;
            nStart = ul + 1;
         }  
      }
      hb_arraySetCL( pArray, ++nToken, szLine + nStart, ul - nStart );        
   } else
      hb_arraySetC( pArray, 1, szLine ); 

   return pArray;
}

HB_FUNC( READ_REG_MULTI_SZ )
{
   HKEY hKey = ( HKEY ) hb_parnl( 1 );
   HKEY hHandle;   
   char * cSubKey = ( char * ) hb_parc( 2 );
   char * cValue  = ( char * ) hb_parc( 3 );
   long nErrCode;
   DWORD lpType = REG_MULTI_SZ;
   DWORD lpcbData;
   BYTE * lpData;
   PHB_ITEM pArrayReturn;
   
   nErrCode = RegOpenKey( hKey, cSubKey, &hHandle);
   
   if( nErrCode != 0 ) 
   {
      pArrayReturn = hb_itemArrayNew( 0 );
      hb_itemReturnRelease( pArrayReturn );
   }
   RegQueryValueEx( hHandle, cValue, NULL, &lpType, NULL, &lpcbData );
   
   lpData = ( BYTE * ) hb_xgrab( lpcbData );
   
   nErrCode = RegQueryValueEx( hHandle, cValue, NULL, &lpType, lpData, &lpcbData );

   if( nErrCode != 0 ) 
   {
      pArrayReturn = hb_itemArrayNew( 0 );
      RegCloseKey( hHandle );
      hb_itemReturnRelease( pArrayReturn );
   }
   
   pArrayReturn = NULL_arrayToken( ( const char * )lpData, lpcbData );
   
   hb_xfree( lpData );
   
   hb_itemReturnRelease( pArrayReturn );

}

#pragma ENDDUMP
 

Re: Leer registros de Windows de tipo REG_MULTI_SZ

Posted: Wed Jun 15, 2011 8:32 am
by SoftWeb
Hola Daniel Garcia-Gil:

Muchísima gracias pedía un poco de ayuda y me lo as dado ya masticado, esta estupendo ahora mismo lo voy a probar.

Gracias

Fernando Santiago