Kbase 33457: How to retrieve all CLSID's subkeys
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  10/05/1998 |
|
Solution ID: P3457
GOAL:
How to retrieve all CLSID's subkeys
FACT(s) (Environment):
Progress 9.1x
Windows
FIX:
This code demonstrates how to retrieve all the CLSID subkeys.
DEFINE VARIABLE SubKey AS CHARACTER NO-UNDO.
DEFINE VARIABLE hKey AS INTEGER NO-UNDO.
DEFINE VARIABLE res AS INTEGER NO-UNDO.
DEFINE VARIABLE hKeyResult AS INTEGER NO-UNDO.
DEFINE VARIABLE hKeyResult2 AS INTEGER NO-UNDO.
DEFINE VARIABLE bufSize AS INTEGER NO-UNDO.
DEFINE VARIABLE dataType AS INTEGER NO-UNDO.
DEFINE VARIABLE lpData AS MEMPTR NO-UNDO.
DEFINE VARIABLE Cnt AS INTEGER NO-UNDO.
DEFINE VARIABLE sName AS MEMPTR NO-UNDO.
DEFINE VARIABLE Ret AS INTEGER NO-UNDO.
&GLOBAL-DEFINE HKEY_CLASSES_ROOT -2147483648.
/* Initialization */
hKey = {&HKEY_CLASSES_ROOT} .
SubKey = "CLSID".
/* Open HKEY_CLASSES_ROOT/CLSID */
RUN RegOpenKeyA (
INPUT hKey, /* handle of open key */
INPUT SubKey, /* name of subkey to open */
OUTPUT hKeyResult, /* handle of open key */
OUTPUT res).
IF res = 0 THEN DO:
OUTPUT TO "c:\out.txt" APPEND .
DO WHILE res NE 259 : /* ERROR_NO_MORE_ITEMS = 259 */
SET-SIZE(sName) = 255.
RUN RegEnumKeyA(
hKeyResult,
Cnt,
OUTPUT sName,
OUTPUT Ret,
OUTPUT res ).
PUT UNFORMATTED GET-STRING(sName,1) .
IF res <> 259 THEN DO: /* ERROR_NO_MORE_ITEMS = 259 */
/* Opens the key */
SubKey = "CLSID\" + GET-STRING(sName,1) + "\InprocServer32\".
/*PUT UNFORMATTED SubKey SKIP.*/
RUN RegOpenKeyExA (
INPUT hKey, /* handle of open key: HKEY_CLASSES_ROOT */
INPUT SubKey, /* name of subkey to open */
INPUT 0, /* reserved */
INPUT 1, /* security access mask */
OUTPUT hKeyResult2, /* handle of open key */
OUTPUT res).
/* Retrieve the default value of InprocServer */
bufSize = 255.
DEF VAR i AS INT NO-UNDO.
/* Call twice the function in order to get the exact buffer size */
DO i = 1 TO 2:
SET-SIZE(lpData) = bufSize.
RUN RegQueryValueExA (hKeyResult2,
"",
0,
OUTPUT datatype,
GET-POINTER-VALUE(lpData), /* address of data buffer */
OUTPUT bufSize, /* data buffer size */
OUTPUT res).
END.
/* Releases the handle of the specified key */
RUN RegCloseKey (hKeyResult2,OUTPUT res).
PUT UNFORMATTED " : " + GET-STRING(lpData,1) SKIP.
SET-SIZE(lpData) = 0.
END.
cnt = Cnt + 1. /* Next key */
SET-SIZE(sName) = 0.
END. /* End Do WHile */
END. /* End IF */
/* Releases the handle of the specified key */
RUN RegCloseKey (
INPUT hKeyResult, /* handle of key to close */
OUTPUT res).
/* ********* Procedure definitions ********* */
PROCEDURE RegOpenKeyA EXTERNAL "advapi32.dll":
DEFINE INPUT PARAMETER hKey AS LONG.
DEFINE INPUT PARAMETER lpSubKey AS CHAR.
DEFINE OUTPUT PARAMETER phkResult AS LONG.
DEFINE RETURN PARAMETER res AS LONG.
END PROCEDURE.
PROCEDURE RegEnumKeyA EXTERNAL "advapi32.dll":
DEFINE INPUT PARAMETER hKey AS LONG.
DEFINE INPUT PARAMETER dwIndex AS LONG.
DEFINE OUTPUT PARAMETER lpName AS MEMPTR.
DEFINE OUTPUT PARAMETER lpcbName AS LONG.
DEFINE RETURN PARAMETER res AS LONG.
END PROCEDURE.
PROCEDURE RegQueryValueExA EXTERNAL "advapi32" :
DEFINE INPUT PARAMETER hkey AS LONG.
DEFINE INPUT PARAMETER lpValueName AS CHARACTE.R.
DEFINE INPUT PARAMETER lpdwReserved AS LONG.
DEFINE OUTPUT PARAMETER lpdwType AS LONG.
DEFINE INPUT PARAMETER lpbData AS LONG.
DEFINE OUTPUT PARAMETER lpcbData AS LONG.
DEFINE RETURN PARAMETER lpresult AS LONG.
END PROCEDURE.
PROCEDURE RegCloseKey EXTERNAL "advapi32" :
DEFINE INPUT PARAMETER hkey AS LONG.
DEFINE RETURN PARAMETER lpresult AS LONG.
END PROCEDURE.
PROCEDURE RegOpenKeyExA EXTERNAL "advapi32" :
DEFINE INPUT PARAMETER hkey AS LONG.
DEFINE INPUT PARAMETER lpSubKey AS CHARACTER.
DEFINE INPUT PARAMETER ulOptions AS LONG.
DEFINE INPUT PARAMETER samDesired AS LONG.
DEFINE OUTPUT PARAMETER phkResult AS LONG.
DEFINE RETURN PARAMETER RetResult AS LONG.
END PROCEDURE.
.