Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
29235 Discussions

How to include ShBrowseForFolder correctly

alex_wolf2002
Beginner
736 Views
Hi,
I'm trying to use the ShBrowseForFolder command with the XFTFile Module (XLITE) form Jugoslav Dujic.
But I didn't manage it.
My question is now, what do I have to include in the code so that this command works? I tryed to orientate me on the GetOpenFileName, but this didn't work.
Her are some pices of the code, perhaps somebody recognizes the my error and can help me.
Code:
integer*4 function SettingsDlgProc( hDlg, message, wParam, lParam )
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_SettingsDlgProc@16' :: SettingsDlgProc
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'SettingsDlgProc' :: SettingsDlgProc
!DEC$ ENDIF

use kernel32
use user32
use gdi32
use dfport
use xftfile
use xstrings
use lifetime05Globals

implicit none

integer     hDlg        ! window handle of the dialog box
integer     message     ! type of message
integer     wParam      ! message-specific information
integer     lParam

include 'resource.fd'

interface 
	integer(4) function InitializeOpen 
	end function
end interface


INTERFACE 
      INTEGER FUNCTION SHBrowseForFolder(BI)
      !DEC$ATTRIBUTES STDCALL, ALIAS: '_SHBrowseForFolderA@4':: SHBrowseForFolder
      INTEGER BI
      END FUNCTION SHBrowseForFolder
END INTERFACE

INTERFACE 
      INTEGER FUNCTION SHGetSpecialFolderLocation(hwndOwner, nFolder, ppidl)
      !DEC$ATTRIBUTES STDCALL, ALIAS: '_SHGetSpecialFolderLocation@12':: SHGetSpecialFolderLocation
      !DEC$ATTRIBUTES REFERENCE::   ppidl
      INTEGER hwndOwner
      INTEGER nFolder
      INTEGER ppidl
      END FUNCTION 
END INTERFACE 

[...]


	hHelicoptertype = GetDlgItem(hDlg,IDC_HELICOPTERTYPE)
	hLifeSingle = GetDlgItem(hDlg,IDC_LIFESINGLE)
	hBatchYes = GetDlgItem(hDlg,IDC_BATCHYES)
	iret = initializeopen()
	buf = 256
	
	 select case (message)
		case (WM_INITDIALOG)
		
                [...]

		case (WM_COMMAND) 
			
                        [...]

			if (LoWord(wParam) .EQ. IDCANCEL) then
				iret = EndDialog(hDlg, TRUE)
				SettingsDlgProc = 1
				return
			end if	  
			if (LoWord(wParam) .EQ. IDC_BROWSE1) then
				Ofn%Flags = NULL
				bret = GETOPENFILENAME(Ofn)
				if (bret == 0) then
					goto 101
				end if
				iret = SetDlgItemText(hDlg, IDC_EDIT1, szfilename// ' 'C)
				SettingsDlgProc = 1
				return
			end if
			if (LoWord(wParam) .EQ. IDC_BROWSE2) then
				Ofn%Flags = NULL
				bret = shbrowseforfolder(BI)
				!bret = GETOPENFILENAME(Ofn)
				if (bret == 0) then
					goto 101
				end if
				iret = SetDlgItemText(hDlg, IDC_EDIT2, szfilename// ' 'C)
				SettingsDlgProc = 1
				return
			end if
			[...]
101	end select

	SettingsDlgProc = 0 ! Didn't process the message
	return
end 
When compiling this code I always get the following error message:
Error: This name does not have a type, and must have an explicit type. [BI]
Thanks
Alex
0 Kudos
3 Replies
Paul_Curtis
Valued Contributor I
736 Views
BI is a TYPE(T_BROWSEINFO), not an integer.
I don't know anything about the XFT code, but the attached example shows how to use BrowseForFolder.
Regards,
Paul Curtis
0 Kudos
Jugoslav_Dujic
Valued Contributor II
736 Views
Hi Alex,
The idea of XFT is that you don't have to cope with very details of Windows API functions -- just include XFT***.f90 into your project, call appropriate X*** function and get the results. Thus, you should simply add XFTFile.f90 into the project (defining XLITE somewhere), and call XBrowse. (But I won't swear it will work for all CVF versions, especially 6.0-6.1)
Alternatively, you can reuse (copy & paste) the code from subroutine XBrowse, but you have to pay attentiontodefinitions of SH*** functions. Namely, older CVF versions did not have defined INTERFACEs to SHBrowseForFolder, T_BROWSWINFO, BI_* constants etc. Thus, ifyou haveCVF older than 6.6you have toinclude appropriatedeclarations from your code, butyou should follow the code structure from XBrowse (fill in the T_BROWSEINFO before calling SHBrowseForFolder, call CoTaskMemFree at the end).
Regards
Jugoslav
P.S. I'm using this opportunity to say hello to all and tell you that I'm generally fine, but quite bored. I'll be back in full power in late August. Until then, take care ;-).
0 Kudos
alex_wolf2002
Beginner
736 Views
Thanks a lot to both of you.
Thefirst exampledidn't work on my System(I'm using CVF 6.5), I don't know why. I alwalys had more the 30 errors.
It works now with XLITE.
But I had to includeadditionally the XFT.f90 file. Without the last one, I always got 3 linker errors (LNK2001).
Alex
0 Kudos
Reply