[Migrated content. Thread originally posted on 19 June 2008]
I recently needed to set the default directory for c$opensavebox to the users local personal data folder(my documents or documents on vista). One approach was to retrieve the USERPROFILE environment variable and append "my documents" to it, but I decided this may not be reliable. Instead, I used the SHGetFolderPath windows api function. Here's a sample for anyone who might also find it useful. Thin-client is detected in the TERMINAL-ABILITIES. I'm not sure if this api call will trigger a UAC warning in Vista.**Note: For thin-client compatability compile with the -Zm switch so that pointers are passed with memory size(this seems to work better than using CALL "WITH MEMORY SIZE" - see section 6.5.6.3 Passing pointers in DLL calls in the AcuConnect user Guide). Also, remember the "@[DISPLAY]:" prefix before the DLL and function name.
In Working Storage:
77 NULL-HANDLE UNSIGNED-INT VALUE NULL.
77 WS-BUFFER PIC X(255) VALUE NULL.
77 PTR-WS-BUFFER USAGE POINTER VALUE NULL.
77 FUNCTION-NAME PIC X(50) VALUE SPACES.
COPY "ACUCOBOL.DEF".
In Procedure Division:
SET ENVIRONMENT "DLL-CONVENTION" TO 1.
ACCEPT TERMINAL-ABILITIES FROM TERMINAL-INFO.
IF IS-REMOTE
CALL "@[DISPLAY]:SHELL32.DLL"
MOVE "@[DISPLAY]:SHGetFolderPathA" TO FUNCTION-NAME
ELSE
CALL "SHELL32.DLL"
MOVE "SHGetFolderPathA" TO FUNCTION-NAME
END-IF.
MOVE NULL TO WS-BUFFER.
SET PTR-WS-BUFFER TO ADDRESS OF WS-BUFFER.
CALL FUNCTION-NAME USING
BY VALUE NULL-HANDLE
BY VALUE 5 |CSIDL_PERSONAL = &H5
BY VALUE NULL-HANDLE
BY VALUE 0
BY VALUE PTR-WS-BUFFER
ON EXCEPTION CONTINUE
NOT ON EXCEPTION
STRING WS-BUFFER DELIMITED BY NULL
INTO OPNSAV-DEFAULT-DIR
END-CALL.
IF IS-REMOTE
CANCEL "@[DISPLAY]:SHELL32.DLL"
ELSE
CANCEL "SHELL32.DLL"
END-IF.



