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.
http://www.avast.com