**********************************************
function getKnownFolderPath (cDefFoldID as string) as string
**********************************************
local ok, nOutBuff, cErrMsg, cOutStr, cUCStr, nGUID
if vartype(__G_DLL_CLSIDFROMSTRING_) = "U"
declare long CLSIDFromString ;
in ole32.dll ;
string cGUID, ;
double @ nRFID
public __G_DLL_CLSIDFROMSTRING_
endif
if vartype(__G_DLL_SHGETKNOWNFOLDERIDLIST_) = "U"
declare long SHGetKnownFolderIDList ;
in shell32.dll ;
double nRFID,;
long dwFlags,;
long hToken,;
long @ ppidl
public __G_DLL_SHGETKNOWNFOLDERIDLIST_
endif
if vartype(__G_DLL_SHGETPATHFROMIDLISTW_) = "U"
declare long SHGetPathFromIDListW ;
in shell32.dll ;
long ppidl, ;
string @ cPath
public __G_DLL_SHGETPATHFROMIDLISTW_
endif
if vartype(__G_DLL_COTASKMEMFREE_) = "U"
declare CoTaskMemFree ;
in ole32.dll ;
long pVoid
public __G_DLL_COTASKMEMFREE_
endif
ok= .f. && Pessimist!
nGUID= 0
cUCStr= strconv(m.cDefFoldID, 5) + chr(0)
cErrMsg= checkSysError(CLSIDFromString(m.cUCStr, @nGUID))
if empty(m.cErrMsg)
nOutBuff= 0
cErrMsg= checkSysError(SHGetKnownFolderIDList(m.nGUID, 0x2000 + 0x4000, 0, @nOutBuff))
endif
if empty(m.cErrMsg)
cOutStr= space(512)
cErrMsg= checkSysError(SHGetPathFromIDListW(m.nOutBuff, @cOutStr))
if empty(m.cErrMsg)
cOutStr= left(m.cOutStr, at(chr(0), m.cOutStr) - 1)
ok= .t.
endif
endif
if ! m.ok
? m.cErrMsg
endif
* Clean up the memory used in the above calls
CoTaskMemFree(m.nOutBuff)
return iif(m.ok, m.cOutStr, "")
endfunc && getKnownFolderPath()
**********************************************
function checkSysError (nResult as integer) as string
**********************************************
local cMsg, cInBuff, nSize
if empty(m.nResult) or m.nResult = 1 && covers missing parameter, 0 (S_OK) or 1 (S_FALSE)
* It must have worked :)
cMsg= ""
else
if vartype(__G_DLL_FORMATMESSAGE_) = "U"
declare long FormatMessage ;
in win32api ;
long dwFlags ,;
long lpvSource,;
long dwMsgId,;
long dwLangId,;
string @lpBuffer,;
long nSize,;
long Argument
public __G_DLL_FORMATMESSAGE_
endif
cInBuff= space(1024)
nSize= FormatMessage(0x1000, 0, m.nResult, 0, @cInBuff, len(m.cInBuff), 0)
if m.nSize > 0
cMsg= left(m.cInBuff, m.nSize)
else
cMsg= "Unknown error - code " + ltrim(str(m.nResult))
endif
endif
return m.cMsg
endfunc && checkSysError()