winqueryreg can list subkey with argument "key" 53/10653/3
Antoine ELIAS [Wed, 6 Mar 2013 11:26:13 +0000 (12:26 +0100)]
Change-Id: If1a301103fd66a9461be4ec49ed7a468f0f8c1c9

scilab/modules/windows_tools/help/en_US/winqueryreg.xml
scilab/modules/windows_tools/help/fr_FR/winqueryreg.xml
scilab/modules/windows_tools/sci_gateway/c/sci_winqueryreg.c
scilab/modules/windows_tools/src/c/registry.c
scilab/modules/windows_tools/src/c/registry.h
scilab/modules/windows_tools/tests/unit_tests/winqueryreg.dia.ref
scilab/modules/windows_tools/tests/unit_tests/winqueryreg.tst

index c1a99a5..658c4c0 100644 (file)
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
-        <synopsis>value = winqueryreg('name', 'rootkey','subkey')
+        <synopsis>
+            value = winqueryreg('name', 'rootkey','subkey')
+            value = winqueryreg('key', 'rootkey','subkey')
             value = winqueryreg('rootkey', 'subkey','valname')
             value = winqueryreg('rootkey','subkey')
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Description</title>
-        <para>value = winqueryreg('name', 'rootkey', 'subkey') returns the key names
+        <para>
+            value = winqueryreg('name', 'rootkey', 'subkey') returns the values names
             in <literal>rootkey\subkey</literal> in a matrix of strings. The first argument
             is the literal quoted string, 'name'.
         </para>
-        <para>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).
+        <para>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).
+        </para>
+        <para>
+            value = winqueryreg('key', 'rootkey', 'subkey') returns the keys names
+            in <literal>rootkey\subkey</literal> in a matrix of strings. The first argument
+            is the literal quoted string, 'key'.
         </para>
-        <para>value = winqueryreg('rootkey', 'subkey', 'valname') returns the value
-            for key valname in <literal>rootkey\subkey</literal>.
+        <para>value = winqueryreg('rootkey', 'subkey', 'valname') returns the data
+            for value valname in <literal>rootkey\subkey</literal>.
         </para>
-        <para>value = winqueryreg('rootkey', 'subkey') returns a value in
+        <para>value = winqueryreg('rootkey', 'subkey') returns a data in
             <literal>rootkey\subkey</literal> that has no value name property.
         </para>
         <para>
-            <literal>Note</literal>The literal name argument and the rootkey argument
+            <literal>Note</literal>The literal name argument, key argument and the rootkey argument
             are case-sensitive. The subkey and valname arguments are not.
         </para>
         <para>supported root keys are: 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_DYN_DATA' and 'HKEY_CURRENT_CONFIG'.</para>
+        <para>and shortcut names: 'HKCR', 'HKCU', 'HKLM', 'HKU', 'HKDD' and 'HKCC'.</para>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example">
+            <![CDATA[ 
 if getos() == 'Windows' then
-  winqueryreg 'HKEY_LOCAL_MACHINE' 'HARDWARE\DESCRIPTION\System\CentralProcessor\0\' 'ProcessorNameString'
-  mousechar = winqueryreg('name', 'HKEY_CURRENT_USER','control panel\mouse');
-  len=size(mousechar);
-  for k=1:len(1)
-     setting = winqueryreg('HKEY_CURRENT_USER','control panel\mouse', mousechar(k));
-     if (mousechar(k)=='') then mousechar(k)='default';,end
-     str = msprintf('%s = %s', mousechar(k), string(setting));
-     disp(str);
-  end
-  winqueryreg('HKEY_CURRENT_CONFIG', 'Software\Fonts\','LogPixels')
+    winqueryreg 'HKEY_LOCAL_MACHINE' 'HARDWARE\DESCRIPTION\System\CentralProcessor\0\' 'ProcessorNameString'
+    
+    mousechar = winqueryreg('name', 'HKEY_CURRENT_USER','control panel\mouse');
+    len=size(mousechar);
+    for k=1:len(1)
+        setting = winqueryreg('HKEY_CURRENT_USER','control panel\mouse', mousechar(k));
+        if (mousechar(k)=='') then mousechar(k)='default';,end
+        str = msprintf('%s = %s', mousechar(k), string(setting));
+        disp(str);
+    end
+    
+    winqueryreg('HKEY_CURRENT_CONFIG', 'Software\Fonts\','LogPixels')
+    winqueryreg('key' ,'HKLM', 'Software\Microsoft\.NETFramework')
 end
- ]]></programlisting>
+ ]]>
+        </programlisting>
     </refsection>
     <refsection>
         <title>History</title>
@@ -70,6 +84,11 @@ end
                 <revnumber>5.4.0</revnumber>
                 <revremark>This function also manages 'HKEY_CURRENT_CONFIG' key.</revremark>
             </revision>
+            <revision>
+                <revnumber>5.4.1</revnumber>
+                <revremark>Manage shorcut root names.</revremark>
+                <revremark>Can retrieve key list names.</revremark>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index 81e8fb9..40da86a 100644 (file)
@@ -8,7 +8,9 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Séquence d'appel</title>
-        <synopsis>value = winqueryreg('name', 'rootkey', 'subkey')
+        <synopsis>
+            value = winqueryreg('name', 'rootkey', 'subkey')
+            value = winqueryreg('key', 'rootkey', 'subkey')
             value = winqueryreg('rootkey', 'subkey', 'valname')
             value = winqueryreg('rootkey', 'subkey')
         </synopsis>
             est un entier sur 32 bits, winqueryreg retourne la valeur comme un entier
             (int32).
         </para>
+        <para>
+            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'.
+        </para>
         <para>value = winqueryreg('rootkey', 'subkey', 'valname') retourne la valeur
             pour la clef valname dans rootkey\subkey.
         </para>
             défaut" de la clef rootkey\subkey.
         </para>
         <para>
-            <literal>Note</literal>Les arguments 'name' et 'rootkey' sont
+            <literal>Note</literal>Les arguments 'name', 'key et 'rootkey' sont
             "case-sensitive". Les arguments 'subkey' et 'valname' ne le sont pas.
         </para>
         <para>Les clefs racine supportées sont: 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_DYN_DATA' and 'HKEY_CURRENT_CONFIG'.</para>
+        <para>Leurs raccourcis peuvent aussi être utilisé 'HKCR', 'HKCU', 'HKLM', 'HKU', 'HKDD' and 'HKCC'</para>
     </refsection>
     <refsection>
         <title>Exemples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example">
+            <![CDATA[
 if getos() == 'Windows' then
-  winqueryreg 'HKEY_LOCAL_MACHINE' 'HARDWARE\DESCRIPTION\System\CentralProcessor\0\' 'ProcessorNameString'
-  mousechar = winqueryreg('name', 'HKEY_CURRENT_USER','control panel\mouse');
-  len=size(mousechar);
-  for k=1:len(1)
-    setting = winqueryreg('HKEY_CURRENT_USER','control panel\mouse', mousechar(k));
-    if (mousechar(k)=='') then mousechar(k)='default';,end
-    str = msprintf('%s = %s', mousechar(k), string(setting));
-    disp(str);
-  end
-  winqueryreg('HKEY_CURRENT_CONFIG', 'Software\Fonts\','LogPixels')
+    winqueryreg 'HKEY_LOCAL_MACHINE' 'HARDWARE\DESCRIPTION\System\CentralProcessor\0\' 'ProcessorNameString'
+
+    mousechar = winqueryreg('name', 'HKEY_CURRENT_USER','control panel\mouse');
+    len=size(mousechar);
+    for k=1:len(1)
+        setting = winqueryreg('HKEY_CURRENT_USER','control panel\mouse', mousechar(k));
+        if (mousechar(k)=='') then mousechar(k)='default';,end
+        str = msprintf('%s = %s', mousechar(k), string(setting));
+        disp(str);
+    end
+
+    winqueryreg('HKEY_CURRENT_CONFIG', 'Software\Fonts\','LogPixels')
+    winqueryreg('key' ,'HKLM', 'Software\Microsoft\.NETFramework')
 end
- ]]></programlisting>
+ ]]>
+        </programlisting>
     </refsection>
     <refsection>
         <title>History</title>
@@ -60,6 +73,11 @@ end
                 <revnumber>5.4.0</revnumber>
                 <revremark>Cette fonction gére également la clé 'HKEY_CURRENT_CONFIG'.</revremark>
             </revision>
+            <revision>
+                <revnumber>5.4.1</revnumber>
+                <revremark>Accepte les raccourcis de clés racine.</revremark>
+                <revremark>Peut renvoyer la liste des noms de clés.</revremark>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index 7b7809e..e4bc4bb 100644 (file)
@@ -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)
index 05bc922..bb8a92e 100644 (file)
 #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);
+}
+/*--------------------------------------------------------------------------*/
index 4cab900..f2b95b2 100644 (file)
@@ -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
 *
 */
 * @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
index 85786e2..6b5b681 100644 (file)
@@ -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);
index f28a805..f874c39 100644 (file)
@@ -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);