Problem solve Get help with specific problems with your technologies, process and projects.

Developing Notes applications in Assembler language

Tips on developing in Assembler

If you were like me, where the first programming language you learnt was assembler, on computers such as the Commodore series (Vic20, C64 and Amiga), then started programming assembler on the PC platforms, until more sophisticated languages became available, then, you will know the advantages of this low level language, not only to mention speed, produces very small executable files, and having full control control over CPU registers and your program only executes exactly what you want it to.

The Microsoft Assembler 32 (MASM32) allows you to continue programming assembler language, in the windows 32 bit environment. I will demonstrate how to use assembler language to develop Notes based applications. The Notes C API stores all available functions that reside in nnotes.dll in the notes.lib file, therefore you are not able to call undocumented functions easily (yes you can call undocumented functions in C). So, in fact, you can also call functions available in other notes dll's such as nnotesws.dll (to call the NEMxxxx functions).

In these examples we are bypassing the use of notes.lib and explicitly opening the required dll (nnotes.dll in this case) and getting the call address of each function in the dll that we require.

A simple notes application to initialise a notes session, open a database (local or server), displays the title of the database, then closes the notes session, compiles to 86k when developed using C API. The same application compiled in assembler language compiles to only 3072 bytes (3k).

In the example below, we load nnotes.dll into memory, extract the memory addresses of the functions we require, initialise a notes session, open a database, close the database, then close the notes session.

There is no error checking performed here, the download application includes full error checking routines.

The sample (Title1) includes the code below, to get the title of a database. The application Title1.exe must be copied to the Lotus Notes install directory (if notes is not in the PATH).

There is also (Title2) which is the same as Title1, but the application does not have to be executed from the local notes install directory, it can be executed from anywhere including a shared network drive, as long as, the calling workstation has Lotus Notes installed, and notes does not have to be in the PATH.

The Title1 and Title2 functions also open the nnotesws.dll and use the undocumented function NEMDisplayError for notes error message display.

My web site is still under construction, but, you may download the above applications at:
My other applications can be downloaded at:

The Microsoft Assembler (MASM32 v6) can be downloaded at

Contact me if you have any queries.


Dennis Fry

STEP 1 - Loading the notes.dll file
This step will load nnotes.dll into memory. Variable 'nnoteslib" stores the handle to the loaded dll file.

Data Structures used:

nnoteslib dd 0
sznnoteslib db "nnotes.dll",0

Assembler Code:

invoke LoadLibrary, ADDR sznnoteslib ;load nnotes.dll
mov nnoteslib, eax ;store the handle to the library

STEP 2 - Getting function call addresses
Once we have loaded nnotes.dll, we how have get the memory address for each function that we need to use from the dll.

Variables used:

 szNotesInitExtended db "NotesInitExtended",0 ;functions are case sensitive szNotesTerm db "NotesTerm",0 szNSFDbOpen db "NSFDbOpen",0 szNSFDbClose db "NSFDbClose",0 szDatabase db "names.nsf",0 ;server!!database NotesInitExtended dd 0 ;varibales to store the calling addresses NotesTerm dd 0 ;later, we then explicitly the functions NSFDbOpen dd 0 NSFDbClose dd 0 hDB dd 0 ;database handle

Assembler Code:

 invoke GetProcAddress, nnoteslib, ADDR szNotesInitExtended ;get the calling address of NotesInitExtended mov NotesInitExtended, eax ;store the address invoke GetProcAddress, nnoteslib, ADDR szNotesTerm mov NotesTerm, eax invoke GetProcAddress, nnoteslib, ADDR szNSFDbOpen mov NSFDbOpen, eax invoke GetProcAddress, nnoteslib, ADDR szNSFDbClose mov NSFDbClose, eax

STEP 3 - Initialize a notes session
To call a function use: call [function name] If the function needs parameters, you must "push" each parameter onto the stack in the reverse order (ie. last parameter is pushed first)

Variables used:

Assembler Code:

 ;Initialize the notes session push CmdLine ;pointer command line parameters push 0 ;number of command line parameters call [NotesInitExtended] ;call NotesInitExtended function ; Open the database lea ecx, hDB ;pointer to the Database Handle push ecx lea ecx, szDatabase ;pointer to the Database String push ecx call [NSFDbOpen] ;call NSFDBOpen function ; Close the database push hDB ;database Handle call [NSFDbClose] ;call NSFDbClose function ; Terminate the notes session call [NotesTerm] ;call NotesTerm function ##### END

Dig Deeper on Domino Resources - Part 3

Start the conversation

Send me notifications when other members comment.

Please create a username to comment.




  • iSeries tutorials's tutorials provide in-depth information on the iSeries. Our iSeries tutorials address areas you need to know about...

  • V6R1 upgrade planning checklist

    When upgrading to V6R1, make sure your software will be supported, your programs will function and the correct PTFs have been ...

  • Connecting multiple iSeries systems through DDM

    Working with databases over multiple iSeries systems can be simple when remotely connecting logical partitions with distributed ...