SHBrowseForFolderA again
- Posted by aku at inbox.as
Sep 07, 2001
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
|
Not Categorized, Please Help
|
|