Hi assembly coders
I need a control or function to browse through folders. Which will return path of choosen folder.
Something similiar to GetOpenFileName. MSDN reference would be good.
Any ideas?
Thanks in advance.
SHBrowseForFolder
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762115%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762115%28v=vs.85%29.aspx)
Thanks dedndave. I need some time to read and try it. I'll be back with questions.
SHBrowseForFolder is much simpler than GetOpenFilename :biggrin:
there is also an example: \Masm32\Examples\exampl04\listview
push 0
call CoInitialize
mov eax, hWnd
mov bi.hwndOwner, eax
mov bi.pidlRoot, NULL
mov eax, OFFSET tSelectedDir
mov bi.pszDisplayName, eax
mov eax, OFFSET tFolderDialogTitle
mov bi.lpszTitle, eax
mov bi.ulFlags, BIF_EDITBOX
mov bi.lpfn, NULL
mov bi.lParam, NULL
mov bi.iImage, NULL
lea eax, bi
push eax
call SHBrowseForFolder
I'm not sure do i've written code correctly. But it seems to work.
It returns selected folder name. But i need full path. I guess that getting
full path has something to do with BROWSEINFO.pidlRoot and returned value by
SHBrowseForFolder.Am i right??? It's to complex stuff for me.
I should always call CoInitalize before i'm using SHBrowseForFolder?
Quote
SHBrowseForFolder is much simpler than GetOpenFilename :biggrin:
there is also an example: \Masm32\Examples\exampl04\listview
I'll also take a look at it latter. Almost sleeping now :icon_confused:
SHBrowseForFolder will return a non-zero pointer, if successful
it is a pointer to an ID list (pidl)
you can pass that pointer to SHGetPathFromIDList to get a full path
also, you may prefer to use OleInitialize instead of CoInitialize because you can use drag-n-drop
generally, when i initialze COM, i do it once at startup, and leave it initialized until exit
a couple other links i should have provided, earlier
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205%28v=vs.85%29.aspx)
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762194%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762194%28v=vs.85%29.aspx)
be specific with the BROWSEINFO ulFlags member values :P
oddly enough, the SHBrowseForFolder documentation does not mention this
but it is mentioned on this page (last sentance)
http://msdn.microsoft.com/en-us/library/windows/desktop/bb776914%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/bb776914%28v=vs.85%29.aspx)
QuoteIt is the responsibility of the calling application to free the IDList
returned by SHBrowseForFolder using CoTaskMemFree.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722%28v=vs.85%29.aspx)
so, when you are done with the pidl....
INVOKE CoTaskMemFree,pidl
your code might look something like this (assuming you have initialized COM)
INVOKE SHBrowseForFolder,addr bi ;BROWSEINFO structure address
.if eax
lea edx,buffer ;MAXPATH sized buffer address
push eax
INVOKE SHGetPathFromIDList,eax,edx
pop eax
INVOKE CoTaskMemFree,eax
.else
mov byte ptr buffer,0
.endif
the pidlRoot member is used to tell it where to start browsing
many applications i have seen use NULL, and browsing starts at the Desktop folder
actually, i find that a little annoying, too
i would often prefer they started at the last folder i browsed for :biggrin:
as you can see, that would require some pidl management
to save the pidl returned rather than releasing it - and make sure the last one is released at exit
Quote from: dedndave on June 17, 2014, 09:06:57 AM
many applications i have seen use NULL, and browsing starts at the Desktop folder
actually, i find that a little annoying, too
include \masm32\MasmBasic\MasmBasic.inc ; download (http://masm32.com/board/index.php?topic=94.0)
Init
Inkey "Selected: ", FolderOpen$("Pick a folder:","AppTitle", "\Masm32\Examples")
Exit
end startLooks simple but there is some sophisticated code under the hood to overcome a Windows bug. (http://masm32.com/board/index.php?topic=94.msg26110#msg26110)
in the SHBrowseForFolder documentation:
QuoteFor Windows Vista or later, it is recommended that you use IFileDialog with the FOS_PICKFOLDERS option rather than the SHBrowseForFolder function. This uses the Open Files dialog in pick folders mode and is the preferred implementation.
i wonder if that's what they are calling a "bug fix" :lol:
i suspect there will be a hotfix for that, at some point
I'll try examples and follow the links.
Thanks for help guys.