The MASM Forum

General => The Campus => Topic started by: vogelsang on June 17, 2014, 04:17:44 AM

Title: Some control reference needed
Post by: vogelsang on June 17, 2014, 04:17:44 AM
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.
Title: Re: Some control reference needed
Post by: dedndave on June 17, 2014, 04:40:56 AM
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)
Title: Re: Some control reference needed
Post by: vogelsang on June 17, 2014, 05:02:59 AM
Thanks dedndave. I need some time to read and try it. I'll be back with questions.
Title: Re: Some control reference needed
Post by: dedndave on June 17, 2014, 06:08:33 AM
SHBrowseForFolder is much simpler than GetOpenFilename   :biggrin:

there is also an example: \Masm32\Examples\exampl04\listview
Title: Re: Some control reference needed
Post by: vogelsang on June 17, 2014, 06:54:09 AM


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:
Title: Re: Some control reference needed
Post by: dedndave on June 17, 2014, 08:44:59 AM
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
Title: Re: Some control reference needed
Post by: dedndave on June 17, 2014, 08:54:26 AM
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
Title: Re: Some control reference needed
Post by: dedndave on June 17, 2014, 09:06:57 AM
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
Title: Re: Some control reference needed
Post by: jj2007 on June 17, 2014, 10:25:01 AM
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 start


Looks 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)
Title: Re: Some control reference needed
Post by: dedndave on June 17, 2014, 11:49:45 AM
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
Title: Re: Some control reference needed
Post by: vogelsang on June 17, 2014, 02:10:49 PM
I'll try examples and follow the links.
Thanks for help guys.