For a small project which requires a custom made DLL for a Lotus Notes database, I have to deploy this custom DLL to the user's workstations in order for the application to work. I've decided to attempt doing it from within the Lotus Notes Database Script, in the PostOpen event. This event is trigerred when the database is opened.
Sub Postopen(Source As Notesuidatabase) Call ExtractDLL("mycustom.dll") End Sub
The database itself contains a hidden view
(dll) keyed on dllname in it.
The forms have a rich text field on them (dllbody) into which a DLL is
attached. What the sub
ExtractDLL now does is to first check if the DLL
exists on the user's workstation, and if it doesn't, it searches for the first
document in the view that matches the name of the file to extract, retrieves
the attachment and dumps it into the Lotus program directory.
Sub ExtractDLL (Byval dllname As String) ' Copy the required DLL to the user's workstation (Win32 only!) ' ' Find the first document called dllname$ in the hidden view ' (dll). Attempt to determine the Lotus Notes program directory ' name and extract the first attachment in that document to it. ' ' Currently, if the file exists, it is not overwritten. Dim s As New NotesSession Dim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocument Dim targetpath As String Dim notesdir As String notesdir$ = getNotesProgramDirectory() targetpath$ = notesdir$ & "\" & dllname$ If Dir(targetpath$) <> "" Then Print dllname$ & ": " & targetpath$ &" already exists on this workstation." Else Dim obj As NotesEmbeddedObject Dim rtitem As NotesRichTextItem Set db = s.currentdatabase Set view = db.GetView("(dll)") Set doc = view.Getdocumentbykey(dllname$) Set rtitem = doc.GetFirstItem("dllbody") Set obj = rtitem.EmbeddedObjects(0) If (obj Is Nothing) Then Print dllname$ & ": Error: No DLL found in this database." End End If ' DLL does not exist. Detach it Print targetpath$ & " is being extracted to your workstation" Call obj.extractFile(targetpath$) End If End Sub
ExtractDLL utilizes Rocky Oliver's getNotesProgramDirectory() function to determine the directory in which Lotus Notes is installed. That is the directory into which the DLLs are dropped. If you have to deploy more than one DLL, just set up the documents which their attachments accordingly and invoke several calls to ExtractDLL, specifying the name of each DLL in turn. Unfortunately, this is not "real" software deployment, as it doesn't cater for updated file versions, but it has helped me in this pinch.