Lotus Notes FAQ Visit Our Sponsor!

Can you get a filename from the user in Lotuscript?

This example illustrates how Lotuscript can be used to call a Win32 API Common File Dialog to get a file. Similiar techniques can be used on other operating systems:

Option Public
Option Declare


Dim Filter As String
Dim FileName As String
Dim FileTitle As String
Dim TruncName As String

Dim VaultWIPRoot As String
Dim VaultWIPUserPath As String

Type tagOPENFILENAME
     lStructSize As Long
     hwndOwner As Long
     hInstance As Long
     lpstrFilter As String
     lpstrCustomFilter As Long
     nMaxCustFilter As Long
     nFilterIndex As Long
     lpstrFile As String
     nMaxFile As Long
     lpstrFileTitle As String
     nMaxFileTitle As Long
     lpstrInitialDir As String
     lpstrTitle As String
     Flags As Long
     nFileOffset As Integer
     nFileExtension As Integer
     lpstrDefExt As String
     lCustData As Long
     lpfnHook As Long
     lpTemplateName As Long     
End Type

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME)  As Long

Dim OPENFILENAME As tagOPENFILENAME

Public Const OFN_ALLOWMULTISELECT = &H200
Public Const OFN_CREATEPROMPT = &H2000
Public Const OFN_ENABLEHOOK = &H20
Public Const OFN_ENABLETEMPLATE = &H40
Public Const OFN_ENABLETEMPLATEHANDLE = &H80
Public Const OFN_EXPLORER = &H80000                         
Public Const OFN_EXTENSIONDIFFERENT = &H400
Public Const OFN_FILEMUSTEXIST = &H1000
Public Const OFN_HIDEREADONLY = &H4
Public Const OFN_LONGNAMES = &H200000                       
Public Const OFN_NOCHANGEDIR = &H8
Public Const OFN_NODEREFERENCELINKS = &H100000
Public Const OFN_NOLONGNAMES = &H40000                      
Public Const OFN_NONETWORKBUTTON = &H20000
Public Const OFN_NOREADONLYRETURN = &H8000
Public Const OFN_NOTESTFILECREATE = &H10000
Public Const OFN_NOVALIDATE = &H100
Public Const OFN_OVERWRITEPROMPT = &H2
Public Const OFN_PATHMUSTEXIST = &H800
Public Const OFN_READONLY = &H1
Public Const OFN_SHAREAWARE = &H4000
Public Const OFN_SHAREFALLTHROUGH = 2
Public Const OFN_SHARENOWARN = 1
Public Const OFN_SHAREWARN = 0
Public Const OFN_SHOWHELP = &H10

Function OpenCommDlg ()
     Dim Title As String    
     Dim DefExt As String
     Dim szCurDir As String 
     Dim APIResults%
     
     SetFileFilter
     
     'Give the dialog a caption title.
     Title = "Add supporting document" & Chr$(0)
     
     'Allocate string space for returned strings
     FileName = Chr$(0) & Space$(255) & Chr$(0)
     FileTitle = Space$(255) & Chr$(0)
     
     'If the user does not specify an extension, append TXT.
     DefExt = "BMP" & Chr$(0)
     
     'Set up the default directory
     szCurDir = Curdir$ & Chr$(0)
     
     'Set up the data structure before you call the GetOpenFileName
     
     OPENFILENAME.lStructSize = Len(OPENFILENAME)
     
     'If the OpenFile Dialog box is not linked to any form use this line.
     'It will pass a null pointer.
     
     OPENFILENAME.hwndOwner = 0&
     
     OPENFILENAME.lpstrFilter =  Filter
     OPENFILENAME.nFilterIndex = 1
     OPENFILENAME.lpstrFile = FileName
     OPENFILENAME.nMaxFile = Len(FileName)
     OPENFILENAME.lpstrFileTitle = FileTitle
     OPENFILENAME.nMaxFileTitle = Len(FileTitle)
     OPENFILENAME.lpstrTitle = Title
     OPENFILENAME.Flags = OFN_FILEMUSTEXIST
     OPENFILENAME.lpstrDefExt = DefExt
     OPENFILENAME.hInstance = 0
     OPENFILENAME.lpstrCustomFilter = 0
     OPENFILENAME.nMaxCustFilter = 0
     OPENFILENAME.lpstrInitialDir = szCurDir
     OPENFILENAME.nFileOffset = 0
     OPENFILENAME.nFileExtension = 0
     OPENFILENAME.lCustData = 0
     OPENFILENAME.lpfnHook = 0
     OPENFILENAME.lpTemplateName = 0
     
     'This will pass the desired data structure to the Windows API,
     'which will in turn it uses to display the Open Dialog form.   
     APIResults% = GetOpenFileName(OPENFILENAME)
     
     If APIResults% <> 0 Then          
          FileName = Cstr( OPENFILENAME.lpstrFile )
          FileTitle = Cstr( OPENFILENAME.lpstrFileTitle )        
          OpenCommDlg = 1
     Else 
          OpenCommDlg = 0
     End If
End Function

Sub Initialize
     If (OpenCommDlg = 1) Then
          Print " "
' use FileExt and other globals that contain the filename and extension, etc.
     Else
          Print "No documents were attached."
     End If
     
End Sub


Another way to do this is to use Notes' undocument API to do this. This is available on more platforms, but the usual caveats apply about using an undocumented API:

Declare Function NEMGetFile Lib "nnotesws" ( wUnk As Integer, Byval szFileName As String, Byval szFilter As String, Byval szTitle As String ) As Integer          'use nnotesws for Win95 and WinNT, inotesws for OS/2, and _nem for Win16

Sub Click(Source As Button)
  Dim szFileName As String*256
  Dim szTitle As String
  Dim szFilter As String
     
  szFilename = Chr(0)
  szTitle = "Select a database"
  szFilter = "Notes Databases|*.NSF|Notes Templates|*.NTF|Programs|*.EXE|All Files|*.*|"          'Use this format for ANY file type
  If NEMGetFile( 0, szFileName, szFilter, szTitle) <> 0 Then
    Messagebox szFileName
  End If
End Sub


Applies to Notes Versions: 4, 4.5, 4.6, 5
Last Modified: October 31, 1998