FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Leer registros de Windows de tipo REG_MULTI_SZ
Posts: 11
Joined: Fri Jun 10, 2011 09:02 AM
Leer registros de Windows de tipo REG_MULTI_SZ
Posted: Tue Jun 14, 2011 09:27 PM

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.
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Leer registros de Windows de tipo REG_MULTI_SZ
Posted: Tue Jun 14, 2011 11:57 PM
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 (fw): Select all Collapse
#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
Posts: 11
Joined: Fri Jun 10, 2011 09:02 AM
Re: Leer registros de Windows de tipo REG_MULTI_SZ
Posted: Wed Jun 15, 2011 08:32 AM

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.

Continue the discussion