/* def var xx as char. load 'Test' base ''HKEY_CURRENT_USER' dir ' GET-KEY-VALUE SECTION 'Software\Microsoft\Windows NT\CurrentVersion\Windows"' KEY 'Device' VALUE xx. message xx view-as alert-box. */ {windows.i} DEFINE VARIABLE list-of-printers AS CHARACTER. DEFINE VARIABLE newdefault AS CHARACTER. DEFINE VARIABLE driver-and-port AS CHARACTER. RUN getkey (INPUT "devices", /* The section name */ INPUT "", /* The key name */ INPUT "win.ini", /* Name of ini file */ OUTPUT list-of-printers). /* Returned stuff */ message list-of-printers view-as alert-box. /* you now have a comma separated list of printer names. Check it: */ /* message list-of-printers view-as alert-box. */ /* allow the user to pick one, suppose he picks the third entry: */ newdefault = ENTRY(2, list-of-printers). /* read driver and port for the new default printer */ RUN getkey (INPUT "devices", /* The section name */ INPUT newdefault, /* The key name */ INPUT "win.ini", /* Name of ini file */ OUTPUT driver-and-port). /* Returned stuff */ /* and write it back */ RUN putkey (INPUT "windows", INPUT "device", INPUT "win.ini", INPUT newdefault + "," + driver-and-port). /* check it: message session:printer-name view-as alert-box. */ RETURN. /* ------------- internal procedures ------------ */ PROCEDURE getkey : DEFINE INPUT PARAMETER i-section AS CHARACTER. DEFINE INPUT PARAMETER i-key AS CHARACTER. DEFINE INPUT PARAMETER i-filename AS CHARACTER. DEFINE OUTPUT PARAMETER o-value AS CHARACTER. DEFINE VARIABLE EntryPointer AS INTEGER NO-UNDO. DEFINE VARIABLE mem1 AS MEMPTR NO-UNDO. DEFINE VARIABLE mem2 AS MEMPTR NO-UNDO. DEFINE VARIABLE mem1size AS INTEGER NO-UNDO. DEFINE VARIABLE mem2size AS INTEGER NO-UNDO. DEFINE VARIABLE i AS INTEGER NO-UNDO. DEFINE VARIABLE cbReturnSize AS INTEGER NO-UNDO. ASSIGN SET-SIZE(mem1) = 4000 mem1size = 4000. IF i-key = "" THEN EntryPointer = 0. ELSE DO: /* Must fill memory with desired key name and EntryPointer must point to it */ ASSIGN SET-SIZE(mem2) = 128 mem2size = 128 EntryPointer = GET-POINTER-VALUE(mem2) PUT-STRING(mem2,1) = i-key. END. RUN getprivateprofilestring{&A} IN hpApi (i-section, EntryPointer, "", GET-POINTER-VALUE(mem1), INPUT mem1size, i-filename, OUTPUT cbReturnSize). /* if i-key was "", Windows will return a list of all keys in i-section. This list is not comma-separated but separated by CHR(0). Progress can not handle that easily so we'll now replace every 0 by a comma: */ DO i = 1 TO cbReturnSize: /* If this is a list convert null character into a comma to generate a csv type variable */ o-value = IF (GET-BYTE(mem1, i) = 0 AND i NE cbReturnSize) THEN o-value + "," ELSE o-value + CHR(GET-BYTE(mem1, i)). END. SET-SIZE(mem1) = 0. SET-SIZE(mem2) = 0. END PROCEDURE. PROCEDURE putkey : DEFINE INPUT PARAMETER i-section AS CHARACTER. DEFINE INPUT PARAMETER i-key AS CHARACTER. DEFINE INPUT PARAMETER i-filename AS CHARACTER. DEFINE INPUT PARAMETER i-value AS CHARACTER. DEFINE VARIABLE cbReturnSize AS INTEGER. RUN writeprivateprofilestring{&A} IN hpApi (i-section, i-key, i-value, i-filename, OUTPUT cbReturnSize ). END PROCEDURE.