releasing MAPI interface pointer

I am experimenting with extended MAPI and ran across a problem I can't seem
to figure out. Here's what happens:

// Minimalist implementation of extended MAPI
// Login and Logout

procedure TForm1.Button1OnClick(Sender: TObject);
    var MapiSession: IMAPISession;
          MapiInit: TMAPIINIT;
          MapiRes: HResult;
begin

    MapiInit.ulVersion :=  MAPI_INIT_VERSION;
    MapiInit.ulFlags :=  MAPI_MULTITHREAD_NOTIFICATIONS;

    MAPIInitialize(@MapiInit);

    MapiRes := MAPILogonEx(0, nil, nil, MAPI_USE_DEFAULT, MapiSession);
    if MapiRes <> S_OK then
        Memo1.Lines.Add('logon failed');

    MapiRes := MapiSession.LogOff(0, 0, 0);
    if MapiRes <> S_OK then
        Memo1.Lines.Add('logoff failed');

    MapiSession._Release;
    MAPIUninitialize;
end;

... When the MapiUninitialize call executes, I get an access violation
exception. I can get around the exception
by NOT calling _Release AND setting MapiSession to nil just before the
MAPIUninitialize call... but that can't be right since _Release should be
called to decrement interface pointer's reference count to zero so that it
can be freed.
    Any Ideas?

BTW I'm using a delphi translation of the C++ MAPI header files written by
Alexander Staubo.