IonicWind Software

IWBasic => General Questions => Topic started by: fasecero on November 07, 2010, 01:36:56 PM

Title: (Shell) IShellView Interface
Post by: fasecero on November 07, 2010, 01:36:56 PM
Hello. I am having problems trying to implement this method:
pIShellView->CreateViewWindow(...)

This is the sample code:

$INCLUDE "WindowsSDK.inc"
$INCLUDE "shlobj.inc"

pointer pidlDesktop = 0
IShellFolder folderDesktop = 0
IShellView desktopView = 0
IShellBrowser browser

CONST LISTVIEW_1 = 1
DIALOG d1
CREATEDIALOG d1,0,0,926,513,0x80C80080,0,"Caption",&d1_handler
'CONTROL d1,@LISTVIEW,"",15,9,895,488,0x50800000,LISTVIEW_1

DOMODAL d1

SUB d1_handler
SELECT @MESSAGE
CASE @IDINITDIALOG
CENTERWINDOW d1
/* Initialize any controls here */
OnInit()
CASE @IDCLOSEWINDOW
OnFinish()
CLOSEDIALOG d1,@IDOK
CASE @IDCONTROL
SELECT @CONTROLID
CASE LISTVIEW_1
/* respond to control notifications here */
ENDSELECT
ENDSELECT
RETURN
ENDSUB

SUB OnInit()
string pszPath = ""
FOLDERSETTINGS fs
WINRECT rc
pointer phWinLV

' get the desktop PIDL
SHGetSpecialFolderLocation(d1.hwnd, CSIDL_DESKTOP, &pidlDesktop)
' get the desktop folder
SHGetDesktopFolder(folderDesktop)
' create a shell view
folderDesktop->CreateViewObject(d1.hwnd, _IID_IShellView, desktopView)

' browser = ... how do I get the IShellBrowser interface?

fs.ViewMode = FVM_ICON
fs.fFlags = 0
browser->AddRef()
desktopView->CreateViewWindow(NULL, &fs, browser, &rc, phWinLV ) ' what's wrong in this line?
ENDSUB

SUB OnFinish()
desktopView->DestroyViewWindow()
desktopView->Release()

folderDesktop->Release()

CoTaskMemFree(pidlDesktop)
ENDSUB

Shell "stuff" is new to me, so this may destroy the planet or something, please carefully :)
Title: Re: (Shell) IShellView Interface
Post by: sapero on November 07, 2010, 11:58:18 PM
Hello,

It is safe while it doesn't delete or write outside the app :)
Check out the fixed version. I had also to fix some headers to compile it, so I'm attaching all files.
Title: Re: (Shell) IShellView Interface
Post by: fasecero on November 11, 2010, 08:32:50 PM
Hello Sapero. Thank you once again, your help is invaluable (and my apologies for taking so long to respond).
There are many things I want to develop, things that need shell/COM, so I'll go step by step (I am studying all the samples that you have already posted).
This particular example works fine except on Win7. The CreateViewObject(...) method returns desktopView = NULL, so I get a segmentation fault in GetCurrentInfo(...). Perhaps this interface is not supported anymore on this operating system.
Title: Re: (Shell) IShellView Interface
Post by: sapero on November 11, 2010, 10:49:26 PM
Maybe CoInitialize is required in Win7? You should always call this function before creating interfaces, and CoUninitialize at the end, after releasing all objects.
Use Ole{Un}initialize instead if you need drag-drop functioning.

Check errors. Save return values in a variable of type HRESULT (signed), or better use UINT if you are planning to PRINT it:
UINT hr = folderDesktop->CreateViewObject(d1.hWnd, _IID_IShellView, &desktopView)
if (FAILED(hr)) ' or if (hr < 0)
print "CreateViewObject failed with eror 0x",HEX$(hr)
else
Title: Re: (Shell) IShellView Interface
Post by: fasecero on November 11, 2010, 11:42:05 PM
Using CoInitialize/CoUninitialize it works like a charm.

Cheers.