SHGetFolderPath uses CSIDL values, whereas SHGetKnownFolderPath uses KnownFolderID GUIDs. One difference is that there are a lot more KnownFolderIDs than there are CSIDLs. That means some of the defined folder locations you may want to get the physical location for can't be accessed through the older SHGetFolderPath method. And that's exactly the situation I ran into.
I needed to find the user's Downloads folder, and there isn't a CSIDL value for that. So, I needed to see how to call the SHGetKnownFolderPath function from PowerBuilder. As with many OLE and Windows API calls, it can save you a lot of time if you can find some Visual Basic code that does what you need to do, and you can convert the syntax. And fortunately, I found some that did this.
So, with a little tweaking, I ended up with this:
Local External Functions:
Function Long CLSIDFromString (ref string lpszGuid, ref blob pGuid ) Library "ole32"
Function Long SHGetKnownFolderPath( ref blob nFolder,int dwFlags,uLong hToken , ref long pszPath) LIBRARY "Shell32.dll"
Subroutine CopyMemory ( ref String pDest, long pSrc, long ByteLen) Library "kernel32" Alias For "RtlMoveMemory"
Subroutine CoTaskMemFree ( long hMem) Library "ole32"
Function Long lstrlenW ( long ptr) Library "kernel32"
PowerScript
blob guid
long ll_rc, ll_folderpointer, ll_folderlen
string ls_folder, ls_folder_id
ls_folder_id = '{374DE290-123F-4565-9164-39C4925E467B}'
IF CLSIDFromString (ls_folder_id, guid ) = 0 THEN
IF SHGetKnownFolderPath ( guid, 0, 0, ll_folderpointer ) = 0 THEN
IF ll_folderpointer <>0 THEN
ll_folderlen = lstrlenW ( ll_folderpointer )
If ll_folderlen <> 0 THEN
ls_folder = Space ( ll_folderlen )
CopyMemory ( ls_folder, ll_folderpointer, ll_folderlen * 2 )
END IF
END IF
CoTaskMemFree ( ll_folderpointer )
END IF
END IF
MessageBox ( "Downloads Folder", ls_folder )
Hope you find that useful as well.
2 comments:
Hey, Bruce.
You could help me with a problem I have with the PFC, I tell you I maintain an application that makes use of PFC and I have a problem because the previous developer disabled the Delete key and to use it I have to press the Ctrl or Shift key to activate the operation of it, where part of the PFC or event can activate it again?
Regards.
The best place to post a question like this is the Appeon Community. https://community.appeon.com/home
Post a Comment