From 50c36bd6f13b17aef8a46e2276e8163b0c144189 Mon Sep 17 00:00:00 2001 From: Antoine ELIAS Date: Wed, 6 Mar 2013 12:26:13 +0100 Subject: [PATCH] winqueryreg can list subkey with argument "key" Change-Id: If1a301103fd66a9461be4ec49ed7a468f0f8c1c9 --- .../windows_tools/help/en_US/winqueryreg.xml | 61 ++++-- .../windows_tools/help/fr_FR/winqueryreg.xml | 46 ++-- .../windows_tools/sci_gateway/c/sci_winqueryreg.c | 70 ++++-- scilab/modules/windows_tools/src/c/registry.c | 227 ++++++++++---------- scilab/modules/windows_tools/src/c/registry.h | 36 +++- .../tests/unit_tests/winqueryreg.dia.ref | 17 +- .../windows_tools/tests/unit_tests/winqueryreg.tst | 19 +- 7 files changed, 282 insertions(+), 194 deletions(-) diff --git a/scilab/modules/windows_tools/help/en_US/winqueryreg.xml b/scilab/modules/windows_tools/help/en_US/winqueryreg.xml index c1a99a5..658c4c0 100644 --- a/scilab/modules/windows_tools/help/en_US/winqueryreg.xml +++ b/scilab/modules/windows_tools/help/en_US/winqueryreg.xml @@ -19,49 +19,63 @@ Calling Sequence - value = winqueryreg('name', 'rootkey','subkey') + + value = winqueryreg('name', 'rootkey','subkey') + value = winqueryreg('key', 'rootkey','subkey') value = winqueryreg('rootkey', 'subkey','valname') value = winqueryreg('rootkey','subkey') Description - value = winqueryreg('name', 'rootkey', 'subkey') returns the key names + + value = winqueryreg('name', 'rootkey', 'subkey') returns the values names in rootkey\subkey in a matrix of strings. The first argument is the literal quoted string, 'name'. - If the value retrieved from the registry is a string, winqueryreg - returns a string. If the value is a 32-bit integer, winqueryreg returns - the value as an integer (int32). + If the data retrieved from the registry is a string, winqueryreg + returns a string. If the data is a 32-bit integer, winqueryreg returns + the data as an integer (int32). + + + value = winqueryreg('key', 'rootkey', 'subkey') returns the keys names + in rootkey\subkey in a matrix of strings. The first argument + is the literal quoted string, 'key'. - value = winqueryreg('rootkey', 'subkey', 'valname') returns the value - for key valname in rootkey\subkey. + value = winqueryreg('rootkey', 'subkey', 'valname') returns the data + for value valname in rootkey\subkey. - value = winqueryreg('rootkey', 'subkey') returns a value in + value = winqueryreg('rootkey', 'subkey') returns a data in rootkey\subkey that has no value name property. - NoteThe literal name argument and the rootkey argument + NoteThe literal name argument, key argument and the rootkey argument are case-sensitive. The subkey and valname arguments are not. supported root keys are: 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_DYN_DATA' and 'HKEY_CURRENT_CONFIG'. + and shortcut names: 'HKCR', 'HKCU', 'HKLM', 'HKU', 'HKDD' and 'HKCC'. Examples - + + ]]> + History @@ -70,6 +84,11 @@ end 5.4.0 This function also manages 'HKEY_CURRENT_CONFIG' key. + + 5.4.1 + Manage shorcut root names. + Can retrieve key list names. + diff --git a/scilab/modules/windows_tools/help/fr_FR/winqueryreg.xml b/scilab/modules/windows_tools/help/fr_FR/winqueryreg.xml index 81e8fb9..40da86a 100644 --- a/scilab/modules/windows_tools/help/fr_FR/winqueryreg.xml +++ b/scilab/modules/windows_tools/help/fr_FR/winqueryreg.xml @@ -8,7 +8,9 @@ Séquence d'appel - value = winqueryreg('name', 'rootkey', 'subkey') + + value = winqueryreg('name', 'rootkey', 'subkey') + value = winqueryreg('key', 'rootkey', 'subkey') value = winqueryreg('rootkey', 'subkey', 'valname') value = winqueryreg('rootkey', 'subkey') @@ -24,6 +26,11 @@ est un entier sur 32 bits, winqueryreg retourne la valeur comme un entier (int32). + + value = winqueryreg('key', 'rootkey', 'subkey') retourne les sous clés + contenues dans rootkey\subkey dans une matrice de chaines de caracteres. + Le premier argument doit etre la chaine de caracteres, 'key'. + value = winqueryreg('rootkey', 'subkey', 'valname') retourne la valeur pour la clef valname dans rootkey\subkey. @@ -31,27 +38,33 @@ défaut" de la clef rootkey\subkey. - NoteLes arguments 'name' et 'rootkey' sont + NoteLes arguments 'name', 'key et 'rootkey' sont "case-sensitive". Les arguments 'subkey' et 'valname' ne le sont pas. Les clefs racine supportées sont: 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_DYN_DATA' and 'HKEY_CURRENT_CONFIG'. + Leurs raccourcis peuvent aussi être utilisé 'HKCR', 'HKCU', 'HKLM', 'HKU', 'HKDD' and 'HKCC' Exemples - + + ]]> + History @@ -60,6 +73,11 @@ end 5.4.0 Cette fonction gére également la clé 'HKEY_CURRENT_CONFIG'. + + 5.4.1 + Accepte les raccourcis de clés racine. + Peut renvoyer la liste des noms de clés. + diff --git a/scilab/modules/windows_tools/sci_gateway/c/sci_winqueryreg.c b/scilab/modules/windows_tools/sci_gateway/c/sci_winqueryreg.c index 7b7809e..e4bc4bb 100644 --- a/scilab/modules/windows_tools/sci_gateway/c/sci_winqueryreg.c +++ b/scilab/modules/windows_tools/sci_gateway/c/sci_winqueryreg.c @@ -20,7 +20,7 @@ #include "PATH_MAX.h" #include "freeArrayOfString.h" /*--------------------------------------------------------------------------*/ -int sci_winqueryreg(char *fname,unsigned long l) +int sci_winqueryreg(char *fname, unsigned long l) { SciErr sciErr; int *piAddressVarOne = NULL; @@ -41,7 +41,7 @@ int sci_winqueryreg(char *fname,unsigned long l) if (Rhs == 3) { sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddressVarThree); - if(sciErr.iErr) + if (sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3); @@ -50,25 +50,25 @@ int sci_winqueryreg(char *fname,unsigned long l) if (!isStringType(pvApiCtx, piAddressVarThree)) { - Scierror(999,_("%s: Wrong type for input argument #%d: String expected.\n"), fname, 3); + Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 3); return 0; } if (!isScalar(pvApiCtx, piAddressVarThree)) { - Scierror(999,_("%s: Wrong size for input argument #%d: String expected.\n"), fname, 3); + Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), fname, 3); return 0; } if (getAllocatedSingleString(pvApiCtx, piAddressVarThree, &pStrParamThree) != 0) { - Scierror(999,_("%s: Memory allocation error.\n"), fname); + Scierror(999, _("%s: Memory allocation error.\n"), fname); return 0; } } sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne); - if(sciErr.iErr) + if (sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1); @@ -77,18 +77,18 @@ int sci_winqueryreg(char *fname,unsigned long l) if (!isStringType(pvApiCtx, piAddressVarOne)) { - Scierror(999,_("%s: Wrong type for input argument #%d: String expected.\n"), fname, 1); + Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 1); return 0; } if (!isScalar(pvApiCtx, piAddressVarOne)) { - Scierror(999,_("%s: Wrong size for input argument #%d: String expected.\n"), fname, 1); + Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), fname, 1); return 0; } sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo); - if(sciErr.iErr) + if (sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2); @@ -97,13 +97,13 @@ int sci_winqueryreg(char *fname,unsigned long l) if (!isStringType(pvApiCtx, piAddressVarTwo)) { - Scierror(999,_("%s: Wrong type for input argument #%d: String expected.\n"), fname, 2); + Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 2); return 0; } if (!isScalar(pvApiCtx, piAddressVarTwo)) { - Scierror(999,_("%s: Wrong size for input argument #%d: String expected.\n"), fname, 2); + Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), fname, 2); return 0; } @@ -114,7 +114,7 @@ int sci_winqueryreg(char *fname,unsigned long l) freeAllocatedSingleString(pStrParamThree); pStrParamThree = NULL; } - Scierror(999,_("%s: Memory allocation error.\n"), fname); + Scierror(999, _("%s: Memory allocation error.\n"), fname); return 0; } @@ -132,37 +132,61 @@ int sci_winqueryreg(char *fname,unsigned long l) pStrParamTwo = NULL; } - Scierror(999,_("%s: Memory allocation error.\n"), fname); + Scierror(999, _("%s: Memory allocation error.\n"), fname); return 0; } if (Rhs == 3) { - if (strcmp(pStrParamOne, "name") == 0) + BOOL bKey = strcmp(pStrParamOne, "key") == 0; + BOOL bValue = strcmp(pStrParamOne, "name") == 0; + + if (bValue || bKey) { int NumbersElm = 0; - WindowsQueryRegistryNumberOfElementsInList(pStrParamTwo, pStrParamThree, &NumbersElm); + if (bValue) + { + WindowsQueryRegistryNumberOfValuesInList(pStrParamTwo, pStrParamThree, &NumbersElm); + } + else + { + WindowsQueryRegistryNumberOfKeysInList(pStrParamTwo, pStrParamThree, &NumbersElm); + } + if (NumbersElm) { - #define MAX_ELMT_REGLIST 255 + BOOL bResult = FALSE; +#define MAX_ELMT_REGLIST 255 char **ListKeysName = NULL; int i = 0; - if (NumbersElm > MAX_ELMT_REGLIST) NumbersElm = MAX_ELMT_REGLIST; + if (NumbersElm > MAX_ELMT_REGLIST) + { + NumbersElm = MAX_ELMT_REGLIST; + } ListKeysName = (char **)MALLOC(sizeof(char*) * NumbersElm); for (i = 0; i < NumbersElm; i++) { ListKeysName[i] = NULL; } - if (WindowsQueryRegistryList(pStrParamTwo, pStrParamThree, NumbersElm, ListKeysName)) + if (bValue) + { + bResult = WindowsQueryRegistryValuesList(pStrParamTwo, pStrParamThree, NumbersElm, ListKeysName); + } + else + { + bResult = WindowsQueryRegistryKeysList(pStrParamTwo, pStrParamThree, NumbersElm, ListKeysName); + } + + if (bResult) { int nOne = 1; sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, NumbersElm, nOne, ListKeysName); if (sciErr.iErr) { printError(&sciErr, 0); - Scierror(999,_("%s: Memory allocation error.\n"), fname); + Scierror(999, _("%s: Memory allocation error.\n"), fname); } else { @@ -172,7 +196,7 @@ int sci_winqueryreg(char *fname,unsigned long l) } else { - Scierror(999,_("%s: Cannot open Windows registry.\n"), fname); + Scierror(999, _("%s: Cannot open Windows registry.\n"), fname); } freeArrayOfString(ListKeysName, NumbersElm); } @@ -220,12 +244,12 @@ int sci_winqueryreg(char *fname,unsigned long l) createScalarDouble(pvApiCtx, Rhs + 1, (double)iOutput); } - LhsVar(1) = Rhs+1; + LhsVar(1) = Rhs + 1; PutLhsVar(); } else { - Scierror(999,_("%s: Cannot query value of this type.\n"),fname); + Scierror(999, _("%s: Cannot query value of this type.\n"), fname); } FREE( pStrOutput); @@ -233,7 +257,7 @@ int sci_winqueryreg(char *fname,unsigned long l) } else { - Scierror(999,_("%s: Memory allocation error.\n"), fname); + Scierror(999, _("%s: Memory allocation error.\n"), fname); } if (pStrParamThree) diff --git a/scilab/modules/windows_tools/src/c/registry.c b/scilab/modules/windows_tools/src/c/registry.c index 05bc922..bb8a92e 100644 --- a/scilab/modules/windows_tools/src/c/registry.c +++ b/scilab/modules/windows_tools/src/c/registry.c @@ -21,22 +21,24 @@ #define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 /*--------------------------------------------------------------------------*/ -BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *ParamOut1, int *ParamOut2, BOOL *OuputIsREG_SZ) + +static BOOL WindowsOpenRegistry(char* _pstRoot, char* _pstKey, HKEY* _pKeyOut) { - BOOL bOK = TRUE; - HKEY key; - HKEY hKeyToOpen = NULL; DWORD OpensKeyOptions = 0; - DWORD type = 0; + HKEY hKeyToOpen = NULL; - hKeyToOpen = GetHkeyrootFromString(ParamIn1); + hKeyToOpen = GetHkeyrootFromString(_pstRoot); + if (hKeyToOpen == NULL) + { + return FALSE; + } #ifdef _WIN64 /* Scilab x64 on x64 windows */ - OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_64KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS) + OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY; + if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS) { - OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_32KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS) + OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_32KEY; + if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS) { return FALSE; } @@ -44,11 +46,11 @@ BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char * #else if (IsWow64()) /* Scilab 32 bits on x64 windows */ { - OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_64KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS) + OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY; + if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS) { - OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_32KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS) + OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_32KEY; + if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS) { return FALSE; } @@ -56,13 +58,26 @@ BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char * } else /* Scilab 32 bits on windows 32 bits */ { - OpensKeyOptions = KEY_QUERY_VALUE; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS) + OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE; + if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS) { return FALSE; } } #endif + return TRUE; +} + +BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *ParamOut1, int *ParamOut2, BOOL *OuputIsREG_SZ) +{ + BOOL bOK = TRUE; + HKEY key; + DWORD type = 0; + + if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE) + { + return FALSE; + } if ( RegQueryValueEx(key, ParamIn3, NULL, &type, NULL, NULL) == ERROR_SUCCESS ) { @@ -97,50 +112,16 @@ BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char * return bOK; } /*--------------------------------------------------------------------------*/ -BOOL WindowsQueryRegistryList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys) +BOOL WindowsQueryRegistryValuesList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys) { - BOOL bOK = TRUE; HKEY key; - HKEY hKeyToOpen = NULL; - DWORD OpensKeyOptions = 0; int i = 0; - hKeyToOpen = GetHkeyrootFromString(ParamIn1); - -#ifdef _WIN64 /* Scilab x64 on x64 windows */ - OpensKeyOptions = KEY_READ | KEY_WOW64_64KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS ) - { - OpensKeyOptions = KEY_READ | KEY_WOW64_32KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS ) - { - return FALSE; - } - } -#else - if (IsWow64()) /* Scilab 32 bits on x64 windows */ + if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE) { - OpensKeyOptions = KEY_READ | KEY_WOW64_64KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS ) - { - OpensKeyOptions = KEY_READ | KEY_WOW64_32KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS ) - { - return FALSE; - } - } - } - else /* Scilab 32 bits on windows 32 bits */ - { - OpensKeyOptions = KEY_READ ; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS ) - { - return FALSE; - } + return FALSE; } -#endif - for (i = 0; i < dimMax; i++) { TCHAR achKey[MAX_KEY_LENGTH]; @@ -158,9 +139,8 @@ BOOL WindowsQueryRegistryList(char *ParamIn1, char *ParamIn2, int dimMax, char * if (retCode != ERROR_SUCCESS) { - bOK = FALSE; RegCloseKey(key); - return bOK; + return FALSE; } else { @@ -170,7 +150,39 @@ BOOL WindowsQueryRegistryList(char *ParamIn1, char *ParamIn2, int dimMax, char * RegCloseKey(key); - return bOK; + return TRUE; +} + +BOOL WindowsQueryRegistryKeysList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys) +{ + HKEY key; + int i = 0; + + if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE) + { + return FALSE; + } + + for (i = 0; i < dimMax; i++) + { + TCHAR achKey[MAX_KEY_LENGTH]; + DWORD cbName = MAX_KEY_LENGTH; + + LONG Err = RegEnumKey(key, i, achKey, cbName); + if (Err != ERROR_SUCCESS) + { + RegCloseKey(key); + return FALSE; + } + else + { + ListKeys[i] = strdup(achKey); + } + } + + RegCloseKey(key); + + return TRUE; } /*--------------------------------------------------------------------------*/ HKEY GetHkeyrootFromString(char *string) @@ -208,74 +220,42 @@ HKEY GetHkeyrootFromString(char *string) return NULL; } /*--------------------------------------------------------------------------*/ -BOOL WindowsQueryRegistryNumberOfElementsInList(char *ParamIn1, char *ParamIn2, int *Number) +static BOOL WindowsQueryRegistryNumberOfItemsInList(char *ParamIn1, char *ParamIn2, int* _piKeyNumber, int* _piValueNumber) { BOOL bOK = TRUE; - HKEY hKeyToOpen; - HKEY hTestKey; - DWORD OpensKeyOptions = 0; - + HKEY key; DWORD retCode = 0; - TCHAR achClass[PATH_MAX] = TEXT(""); // buffer for class name - DWORD cchClassName = PATH_MAX; // size of class string - DWORD cSubKeys = 0; // number of subkeys - DWORD cbMaxSubKey = 0; // longest subkey size - DWORD cchMaxClass = 0; // longest class string - DWORD cValues = 0; // number of values for key - DWORD cchMaxValue = 0; // longest value name - DWORD cbMaxValueData = 0; // longest value data - DWORD cbSecurityDescriptor = 0; // size of security descriptor - FILETIME ftLastWriteTime; // last write time - - hKeyToOpen = GetHkeyrootFromString(ParamIn1); + TCHAR achClass[PATH_MAX] = TEXT(""); // buffer for class name + DWORD cchClassName = PATH_MAX; // size of class string + DWORD cSubKeys = 0; // number of subkeys + DWORD cbMaxSubKey = 0; // longest subkey size + DWORD cchMaxClass = 0; // longest class string + DWORD cValues = 0; // number of values for key + DWORD cchMaxValue = 0; // longest value name + DWORD cbMaxValueData = 0; // longest value data + DWORD cbSecurityDescriptor = 0; // size of security descriptor + FILETIME ftLastWriteTime; // last write time -#ifdef _WIN64 /* Scilab x64 on x64 windows */ - OpensKeyOptions = KEY_READ | KEY_WOW64_64KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS ) + if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE) { - OpensKeyOptions = KEY_READ | KEY_WOW64_32KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS ) - { - return FALSE; - } + return FALSE; } -#else - if (IsWow64()) /* Scilab 32 bits on x64 windows */ - { - OpensKeyOptions = KEY_READ | KEY_WOW64_64KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS ) - { - OpensKeyOptions = KEY_READ | KEY_WOW64_32KEY; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS ) - { - return FALSE; - } - } - } - else /* Scilab 32 bits on windows 32 bits */ - { - OpensKeyOptions = KEY_READ ; - if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS ) - { - return FALSE; - } - } -#endif + retCode = RegQueryInfoKey( - hTestKey, // key handle - achClass, // buffer for class name - &cchClassName, // size of class string - NULL, // reserved - &cSubKeys, // number of subkeys - &cbMaxSubKey, // longest subkey size - &cchMaxClass, // longest class string - &cValues, // number of values for this key - &cchMaxValue, // longest value name - &cbMaxValueData, // longest value data - &cbSecurityDescriptor, // security descriptor - &ftLastWriteTime); // last write time + key, // key handle + achClass, // buffer for class name + &cchClassName, // size of class string + NULL, // reserved + &cSubKeys, // number of subkeys + &cbMaxSubKey, // longest subkey size + &cchMaxClass, // longest class string + &cValues, // number of values for this key + &cchMaxValue, // longest value name + &cbMaxValueData, // longest value data + &cbSecurityDescriptor, // security descriptor + &ftLastWriteTime); // last write time if (retCode != ERROR_SUCCESS) { @@ -283,11 +263,24 @@ BOOL WindowsQueryRegistryNumberOfElementsInList(char *ParamIn1, char *ParamIn2, } else { - *Number = cValues; + *_piValueNumber = cValues; + *_piKeyNumber = cSubKeys; } - RegCloseKey(hKeyToOpen); + RegCloseKey(key); return bOK; } /*--------------------------------------------------------------------------*/ +BOOL WindowsQueryRegistryNumberOfValuesInList(char *ParamIn1, char *ParamIn2, int *Number) +{ + int iKey = 0; + return WindowsQueryRegistryNumberOfItemsInList(ParamIn1, ParamIn2, &iKey, Number); +} +/*--------------------------------------------------------------------------*/ +BOOL WindowsQueryRegistryNumberOfKeysInList(char *ParamIn1, char *ParamIn2, int *Number) +{ + int iValue = 0; + return WindowsQueryRegistryNumberOfItemsInList(ParamIn1, ParamIn2, Number, &iValue); +} +/*--------------------------------------------------------------------------*/ diff --git a/scilab/modules/windows_tools/src/c/registry.h b/scilab/modules/windows_tools/src/c/registry.h index 4cab900..f2b95b2 100644 --- a/scilab/modules/windows_tools/src/c/registry.h +++ b/scilab/modules/windows_tools/src/c/registry.h @@ -1,11 +1,11 @@ /* * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab * Copyright (C) INRIA - Allan CORNET -* +* * This file must be used under the terms of the CeCILL. * This source file is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms -* are also available at +* are also available at * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt * */ @@ -28,18 +28,30 @@ * @param[out] OuputIsREG_SZ * @return TRUE or FALSE */ -BOOL WindowsQueryRegistry(char *ParamIn1,char *ParamIn2,char *ParamIn3,char *ParamOut1,int *ParamOut2,BOOL *OuputIsREG_SZ); +BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *ParamOut1, int *ParamOut2, BOOL *OuputIsREG_SZ); /** -* WindowsQueryRegistryList +* WindowsQueryRegistryValuesList * Query a list of values in a registry key * @param[in] ParamIn1 (HKEY) * @param[in] ParamIn2 (SUBKEY) -* @param[in] dimMax +* @param[in] dimMax * @param[out] ListKeys (values) * @return TRUE or FALSE */ -BOOL WindowsQueryRegistryList(char *ParamIn1,char *ParamIn2,int dimMax,char **ListKeys); +BOOL WindowsQueryRegistryValuesList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys); + +/** +* WindowsQueryRegistryKeysList +* Query a list of values in a registry key +* @param[in] ParamIn1 (HKEY) +* @param[in] ParamIn2 (SUBKEY) +* @param[in] dimMax +* @param[out] ListKeys (values) +* @return TRUE or FALSE +*/ +BOOL WindowsQueryRegistryKeysList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys); + /** * WindowsQueryRegistryNumberOfElementsInList @@ -49,7 +61,17 @@ BOOL WindowsQueryRegistryList(char *ParamIn1,char *ParamIn2,int dimMax,char **Li * @param[out] Number * @return TRUE or FALSE */ -BOOL WindowsQueryRegistryNumberOfElementsInList(char *ParamIn1,char *ParamIn2,int *Number); +BOOL WindowsQueryRegistryNumberOfValuesInList(char *ParamIn1, char *ParamIn2, int *Number); + +/** +* WindowsQueryRegistryNumberOfKeysInList +* get numbers of Key in a list +* @param[in] ParamIn1 (HKEY) +* @param[in] ParamIn2 (SUBKEY) +* @param[out] Number +* @return TRUE or FALSE +*/ +BOOL WindowsQueryRegistryNumberOfKeysInList(char *ParamIn1, char *ParamIn2, int *Number); /** * GetHkeyrootFromString diff --git a/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.dia.ref b/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.dia.ref index 85786e2..6b5b681 100644 --- a/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.dia.ref +++ b/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.dia.ref @@ -4,11 +4,16 @@ // // This file is distributed under the same license as the Scilab package. // ============================================================================= -ierr = execstr('winqueryreg()','errcatch'); -if ierr <> 77 then bugmes();quit;end -ierr = execstr('winqueryreg(''name'', ''HKEY_CURRENT_USER'')','errcatch'); -if ierr <> 999 then bugmes();quit;end +// +// <-- WINDOWS ONLY --> +assert_checkerror('winqueryreg()', [], 77); +assert_checkerror('winqueryreg(''name'', ''HKEY_CURRENT_USER'')', [], 999); mousechar = winqueryreg('name', 'HKEY_CURRENT_USER','control panel\mouse'); -if size(mousechar,'*') <> 18 then bugmes();quit;end +assert_checktrue(size(mousechar,'*') <> 0); cpu = winqueryreg('HKEY_LOCAL_MACHINE','HARDWARE\DESCRIPTION\System\CentralProcessor\0\','ProcessorNameString'); -if length(cpu) == 0 then bugmes();quit;end +assert_checktrue(length(cpu) <> 0); +software1 = winqueryreg('key', 'HKEY_LOCAL_MACHINE','Software'); +assert_checktrue(size(software1, "*") <> 0); +software2 = winqueryreg('key', 'HKLM','Software'); +assert_checktrue(size(software2, "*") <> 0); +assert_checkequal(software1, software2); diff --git a/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.tst b/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.tst index f28a805..f874c39 100644 --- a/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.tst +++ b/scilab/modules/windows_tools/tests/unit_tests/winqueryreg.tst @@ -4,16 +4,23 @@ // // This file is distributed under the same license as the Scilab package. // ============================================================================= +// +// <-- WINDOWS ONLY --> -ierr = execstr('winqueryreg()','errcatch'); -if ierr <> 77 then pause,end -ierr = execstr('winqueryreg(''name'', ''HKEY_CURRENT_USER'')','errcatch'); -if ierr <> 999 then pause,end +assert_checkerror('winqueryreg()', [], 77); +assert_checkerror('winqueryreg(''name'', ''HKEY_CURRENT_USER'')', [], 999); mousechar = winqueryreg('name', 'HKEY_CURRENT_USER','control panel\mouse'); -if size(mousechar,'*') <> 18 then pause,end +assert_checktrue(size(mousechar,'*') <> 0); cpu = winqueryreg('HKEY_LOCAL_MACHINE','HARDWARE\DESCRIPTION\System\CentralProcessor\0\','ProcessorNameString'); -if length(cpu) == 0 then pause,end +assert_checktrue(length(cpu) <> 0); + +software1 = winqueryreg('key', 'HKEY_LOCAL_MACHINE','Software'); +assert_checktrue(size(software1, "*") <> 0); + +software2 = winqueryreg('key', 'HKLM','Software'); +assert_checktrue(size(software2, "*") <> 0); +assert_checkequal(software1, software2); -- 1.7.9.5