Leer registros de Windows de tipo REG_MULTI_SZ

Post Reply
User avatar
SoftWeb
Posts: 11
Joined: Fri Jun 10, 2011 9:02 am
Location: Cadiz, España
Contact:

Leer registros de Windows de tipo REG_MULTI_SZ

Post 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
Fernando Santiago
SoftWeb S.L.
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Leer registros de Windows de tipo REG_MULTI_SZ

Post 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
 
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
SoftWeb
Posts: 11
Joined: Fri Jun 10, 2011 9:02 am
Location: Cadiz, España
Contact:

Re: Leer registros de Windows de tipo REG_MULTI_SZ

Post 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
Fernando Santiago
SoftWeb S.L.
Post Reply