Lotus C API Toolkitを使う

ここからC APIをダウンロードできます↓
http://www.ibm.com/developerworks/lotus/documentation/

サンプルのビルド手順

User Guideでも結構詳しく説明されていますが、こんな感じです。

  • Notesをインストールする
  • Visual Studio 2008とかのVC++の開発環境をインストールする
  • 「Lotus C API toolkit」をダウンロードして展開
  • 環境変数に以下を追加(インストールパスに応じて読み替えてください)
    • PATH -> C:\Program Files\Lotus\notes;
    • INCLUDE -> E:\notesapi\include
    • LIB -> E:\notesapi\lib\mswin32
  • Visual Studio 2008コマンドプロンプトを開いて、イントロダクションサンプルをビルド
E:
cd E:\notesapi\samples\basic\introwin
nmake /f mswin32.mak /a

作成されたINTROWIN.exeを実行すると真っ白な画面が開きます。(データベース名を取得するサンプルらしい)

パスワード入力要求をフックするサンプル

C APIにしかない機能のExtension Managerを使った、Notesのパスワード入力要求をフックするサンプルが「notesapi\samples\misc\extpwd」に入っています。
でも同じ要領でビルドしようとしたら

mswin32.def : error LNK2001: 外部シンボル "LibMain" は未解決です。
nextpwd.lib : fatal error LNK1120: 外部参照 1 が未解決です。
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\link.EXE"' : リターン コード '0x460'
Stop.

ってのが出た。回避方法がよくわからないのでmswin32.defの「LibMain」の行を削除してビルドは成功。(警告は他にも出てる)

作成されたnextpwd.dllをC:\Program Files\Lotus\notesにコピーして、notes.iniに以下を追記する

EXTMGR_ADDINS=EXTPWD

Notesを起動すると、いつものパスワードダイアログではないカスタムダイアログが表示されます。

パスワード入力を無くす

さっきのサンプルを修正して自動ログインしたい。
extpwd.cの130行あたり

answer = ExtGetPasswordText (
        MaxPwdLen,
        FileName,
        OwnerName,
        retLength,
        retPassword);

ここでカスタムダイアログを表示するコードを実行していますが、これを消して以下に修正

strcpy_s(retPassword, 8, "password");
*retLength = 8;
return (ERR_BSAFE_EXTERNAL_PASSWORD);

retPasswordにパスワード、retLengthにパスワードの文字数を返します。
FileName、OwnerNameなどは既にnotes.iniから読み込んだ初期値が入っている状態なので、必要がなければ触らなくてOK。

同じようにビルドしてdllをnotesフォルダにコピーし、Notesを起動するとパスワードダイアログが表示されなくなるはずです。(パスワードが間違っていた場合はエラーメッセージが表示されます)
あとは、どっかのiniファイルからパスワードを読み込むようにすれば完璧。