RE: Common Dialogs
- Posted by Cassidy Napoli <gonzotek at yahoo.com> Oct 11, 2001
- 342 views
Thanks, I found this from a message a "ak- at inbox.as" posted a few weeks ago. He claims it works. I'm going to attempt using it now. I'll let you know how it goes after I'm sure it does/doesn't work. Try this, append to end of win32lib. This version doesn't crash on my machine, and cannot select my computer or network neighborhood. You can select the selected directory name. If this is better you can include this to next release of win32lib. but change the memory routines to win32lib's. Example use: x = getFolder(Window1, "c:\\windows", "Select folder") ---------------------------- constant xSHBrowseForFolder = registerw32Function(shell32,"SHBrowseForFolderA", {C_POINTER}, C_POINTER) constant xSHGetPathFromIDList = registerw32Function(shell32,"SHGetPathFromIDList",{C_ULONG,C_POINTER},C_ULONG) function callbackselect(atom hWnd, atom uMsg, atom lParam, atom lpData) object x if uMsg = 1 then x = w32Func(xSendMessage, {hWnd, 1126, 1, lpData}) end if return 0 end function global function getFolder(atom id, sequence filename, sequence title) object bi, pbi, ret, folder, pfolder if length(filename)=2 and filename[2]=':' then filename &= '\\' elsif filename[length(filename)] = '\\' then filename = filename[1..length(filename)-1] end if bi = {0,0,0,0, -- hwndOwner = 1 0,0,0,0, -- pIDLRoot = 5 0,0,0,0, -- pszDisplayName = 9 0,0,0,0, -- lpszTitle = 13 0,0,0,0, -- ulFlags = 17 0,0,0,0, -- lpfnCallback = 21 0,0,0,0, -- lParam = 25 0,0,0,0} -- iImage = 29 bi[1..4] = int_to_bytes(getHandle(id)) bi[13..16] = int_to_bytes(allocate_string(title)) bi[17..20] = int_to_bytes(1) bi[21..24] = int_to_bytes(call_back(routine_id("callbackselect"))) bi[25..28] = int_to_bytes(allocate_string(filename)) pbi = allocate(length(bi)) poke(pbi, bi) ret = w32Func(xSHBrowseForFolder, {pbi}) free(bytes_to_int(bi[13..16])) free(bytes_to_int(bi[21..24])) free(bytes_to_int(bi[25..28])) free(pbi) pfolder = allocate(256) if w32Func(xSHGetPathFromIDList,{ret,pfolder}) then folder = peek_string(pfolder) else folder = "" end if free(pfolder) return folder end function Jonas Temple wrote: > Cassidy, > > The directory selection is actually a shell function, not a common > dialog (I made the same assumption!). Here's a partially working > program to show how to make this happen. There is a problem with it, > however. The memory for the calls to these routines should be allocated > > with shell functions, not typical memory routines (I think this is > right, I seem to remember reading this in the SDK docs). I was going to > > finish this to get it working but never got there. Maybe someone else > has done this? > > HTH, > > Jonas > > > atom binfo, result,memfolder > sequence folder > > constant xSHBrowseForFolder = registerw32Function(shell32, > "SHBrowseForFolder", > {C_POINTER}, C_POINTER) > > constant xSHGetPathFromIDList = > registerw32Function(shell32,"SHGetPathFromIDList",{C_ULONG,C_POINTER},C_ULONG) > > > global constant > bfOwner = allot( Long ), > bfpidlRoot = allot( Long ), > bfDisplayName = allot( Lpsz ), > bfTitle = allot( Lpsz ), > bfFlags = allot( Long ), > bfFunction = allot( Long ), > bfParam = allot( Long ), > bfImage = allot( Long ), > SIZEOF_BROWSEINFO = allotted_size() > > binfo = acquire_mem(0, SIZEOF_BROWSEINFO) > > store( binfo, bfOwner, 0) > store( binfo, bfpidlRoot, NULL) > store( binfo, bfDisplayName, "") > store( binfo, bfTitle, "Select a Folder") > store( binfo, bfFlags, NULL) > store( binfo, bfFunction, NULL) > store( binfo, bfParam, NULL) > store( binfo, bfImage, NULL) > > result = w32Func(xSHBrowseForFolder, {binfo}) > memfolder= acquire_mem(0,repeat(1024,0)) > if w32Func(xSHGetPathFromIDList,{result,memfolder}) then > --the string pointed to by folder now contains the path > folder = peek_string(memfolder) > else > folder = "" > end if > --release_mem(memfolder) > release_mem(binfo) > > if message_box("Folder: " & folder, "Test", MB_OK) then end if > ----------------------------------------- > > Cassidy Napoli wrote: > > How would I get the win32 common dialog for directory selection? It > > appears as a treeview of directories that a user can choose from, and > > returns the directory selected. > >