How to access Win32 Btrieve API from VB.NET

This sample application deomonstrates how to call Win32 Btrieve API from VB.NET.
It calls BTRCALL to manipulate a Btrieve data file, course.mkd. The data file is
distributed as part of the Pervasive.SQL engine product. The Btrieve operations
covered in the sample are:

OPEN
CLOSE
RESET
GET FIRST
GET LAST
GET NEXT
GET PREVIOUS
GET EQUAL
GET KEY
INSERT
UPDATE
DELETE

The code contains statements
. declare Win32 Btrieve API in VB.NET,
. marshal VB6 specific data type mapped to Btrieve data file,
. allocate/release unmanaged native memory block, read from/write into the unmanaged 
  memory block.

Featured Highlights:

The Win32 Btrieve API functions and constants have been wrapped up in VB.NET syntax:

. BTR contants: A goup of commonly used Btrieve API constants, e.g., operation,
  is defined as public constant for easy access.
. BTR records: A specific Btrieve record, BtrCourseRecType, is defined as structure with 
  StructLayout attribute. BtrCourseRecType is an exact physical layout of the Btrieve data file, 
  course.mkd. The structure is used to calculate offset and size when exchanging data with
  an unmanaged memory block.
  
  An application specific record, CourseRecType, is defined as structure. The structure is
  used to exchange content with unmanaged memory block as well as with GUI component.
. Embedded BTR Sring: Embedded string within a BTR structure is defined as String with 
  the attribute of <MarshalAs(UnmangedType.ByValTStr, SizeConst:=the string length)>.
  Such embedded string must be initialized to the correct length before passing the 
  structure to BTRCALL.
. BTRCALL API: It is declared as a protected function since it is called only within
  the module. It is declared as overload function with specific parameters of different 
  types replace the original "As any" parameters. To read/write data from/into specific
  Btrieve data files, databuffer parameter is defined as type, IntPtr, which is pointing
  to an unmanaged memory block.
