I might be late to this or someone might have posted this.
This is what I use to get a users path in xp/win 7/win 8.
SET VAR vpath =(ENVVAL('userprofile') + '\Desktop\')
Dan Goldberg
From: Doug Hamilton
Sent: Friday, July 25, 2014 10:00 AM
To: RBASE-L Mailing List
Subject: [RBASE-L] - Path of User's Desktop
Back Jan '11, Mike Byerley posted a small RBase routine using stdcall to get
the path to the user's desktop.
It has worked flawlessly until I did some testing yesterday on a routine that
uses Mike's code. The entire code is below for context, but the specific
command where the path is lost is:
SET VAR gUserDeskTop = (SGET(.strpath, ((SLOC(.strpath, (CHAR(0)))) - 1), 1))
Variable strpath is predefined as 260 null characters.
The correct path is returned in the variable strpath; the SGET's purpose is
extract just the path from the 260 characters (path + nulls) that was returned
by the dlcall.
However, it appears that strpath is already trimmed of trailing nulls - or any
other characters that I've tried predefining in strpath. Hence the SLOC chokes
and gUserDeskTop that is returned is blank.
So I guess the question is: Are trailing characters automatically trimmed in
the dlcall?
Is this a fluke on my system or a permanent update for which I should remove
the SGET command?
Is this a change in a Win 7 update or an RBase update?
I've scanned 4 What's New in R:Base looking for "trim" and "trail" but couldn't
find any relevant references.
RBase 9.5.4.30717 (32)
Win 7, SP1
Just wondering what the best course of action should be.
TIA,
Doug
--UserDesktop.RMD get full path to user's desktop
--Courtesy Mike Beyerly, 01/13/11
{demo of SHGetSpecialFolderPath function mbyerley 6/1/2008 }
SET VAR max_path INTEGER = 260
SET VAR lngfolderfound INTEGER = NULL
SET VAR strpath TEXT = NULL
SET VAR gUserDeskTop TEXT = NULL
IF (chkfunc('SHGetSpecialFolderPathA')) = 0 THEN
STDCALL function 'SHGetSpecialFolderPathA' alias 'SHGetSpecialFolderPath' +
(integer, integer, ptr text (260), integer) : integer
ENDIF
SET VAR lngfolder = 16
{ Set the variable as a BUFFER of MAX_PATH Characters filled with Nulls. The
VAR is passed by Reference and is filled with the PATH in the function. When
VARs are created this way, you can't trim the length, so we look for the first
NULL (Char(0)) in the returned value and SGET everything up to that value
to COPY to the VAR specfolder. As Simple as that. If you wanted to Create
the
Special Folder if it is NOT FOUND, you would change the first 0 in the DLCALL
argument to a NON ZERO value.
}
-- CREATE the BUFFER of length max_path for
SET VAR strpath = (SFIL((CHAR(0)), .max_path))
SET VAR lngfolderfound = +
(dlcall('Shell32','SHGetSpecialFolderPathA', 0, lngfolder, strpath, 0))
IF lngfolderfound > 0 THEN
-- The strpath var has to be SGET to omit the trailing nulls from the BUFFER
SET VAR gUserDeskTop = (SGET(.strpath, ((SLOC(.strpath, (CHAR(0)))) - 1), 1))
ENDIF
CLEAR VAR +
lngfolder, +
lngfolderfound, +
max_path, +
strpath
RETURN
--------------------------------------------------------------------------------
This email is free from viruses and malware because avast! Antivirus
protection is active.