OSLoadProgramのサンプルを理解する

2009年10月14日 00:50

- バックナンバー -
1. OSLoadProgramを呼んでみるサンプル
2. OSLoadProgramのサンプルを理解する
3. C API はnnotes.dllから呼ばれている
4. 参照渡しか値渡しか
5. 型を変換する
6. 構造体を定義する
7. OSLoadString を使ってみよう

 さて、前回のOSLoadProgramのサンプルの記事ではたくさんの拍手を頂きありがとうございました。
間が空いてしまって申し訳なかったのですが、今日は始めのトピックとして前回のサンプルを呪文のように実行してしまったのでもう少し意味が分かるように考えてみる事にします。(これもゆっくり連載したいので何回かに分けて紹介しようと思います。) LotusScript からNotesの C API を呼ぶ、ということがどういうことなのか少し分かってくるのではないかと思います。この辺を踏まえて、実際に自分で色々呼べるようになるのはもう少し先になるのではないかと思うのでご容赦下さい。

 はじめに少しでもこの記事を通じてLotus Notes/Domino C API を勉強しようと思っている方は、以下のページからToolkitをダウンロードしておいていいのではないかと思います。
 コンパイルまでする気が無くても、別にインストール作業は必要ないですし、サンプルやリファレンスが入手できるだけでも面白いのではないかと思います。

Lotus C API Toolkit Download Page (Search)

その前に、このブログを読むのに必要な情報だけでいいなら以下のリファレンスページをダウンロードしておくだけでもいいのではないかと思います。
Lotus C API 7.0 Reference for Domino and Notes

それでは、始めに基本中の基本として、OSLoadProgramとはどういうAPI なのか考えてみる事にします。
ヘルプの記載を見てみましょう。

C API リファレンスより
STATUS LNPUBLIC OSLoadProgram(
char far *filename,
char far *WorkingDir,
char far *Arguments,
WORD Flags);

Description :
This function loads and executes an external Program. Use OSLoadProgram to load and execute software modules at run time.

OSLoadProgram provides C API programs with a platform-independent procedure for loading and executing a program.

Starting with Release 4.6, the command line is assumed to be in LMBCS, the Lotus Multi-Byte Character Set, and is translated to the operating system's native character set before being passed to the called program.


今更ヘルプの読み方的な話をするのは多少失礼になる方もいると思うのですが、引数・戻り値の説明を理解するのは、LotusScriptなどと同じなのですが、関数のインターフェース(戻り値とか引数の型の事)を理解する事が非常に重要になります。C言語が分からない方にはちょっと読みにくく感じるかもしれません。

 STATUSというのは何の呪文だろうと思うかも知れませんが、これもAPI リファレンスの記述を見ると、

typedef WORD STATUS;

となっているので、要はWORD型であることが分かります。
同様にして分かりにくい、LNPUBLICについても調べてみると、Notes C API 関数の Calling Convention と書かれていますが、要するに外部から呼び出し可能なAPIについているおまじないのようなものだと理解してもらえれば十分なのではないかと思います。 Lotus Notes Public Function、みたいなノリなのではないでしょうか。

ちなみにOSLoadProgram というのはここでも記載のある通り、Notes でプログラムを実行するためのAPIですが、Notesでは内部的にも非常によく使われることが多いものです。
もっとも典型的な使用例では、サーバー起動時にNotes.ini 行にServerTasks行に書いてある順にタスクが起動させられていますが、ここでタスクを起動する際に使用されているAPIはOSLoadProgram です。

ちなみにこの辺の詳細情報を取得する際には、Notes/Domino 7 以降では、DEBUGSIGCIHLD=1 をNotes.iniに指定します。(それ以前のリリースでは、UNIX版のみ)
元々はこの設定は、その名の通り、SIGCHLD (または SIGCHILD)の情報を取得するために使われていたのですが、実は起動時の情報も必要なのでこの設定によって記録されます。

それと、OSLoadProgramをサンプルに選んだ理由ですが、APIを一つ呼ぶだけで処理が完結するいわゆる「呼び出しやすい」例だったからです。
 「LotusScriptから C APIを呼び出せる」と言う言葉を聞いて、C APIの関数はすべてLotusScriptで呼べるような誤解をする人がいますが、関数ポインタやコールバック関数など技術的にLotusScriptでは表現不能なものもあるので、注意が必要です。(実はVBではこの辺をある程度補完してくれる関数もあるので、VBには移植可能だったけど、LotusScriptでは出来ない、と言う事もあります。)
と言うわけで C API の呼び出しに関しては、これから紹介する話で機械的な変換方法が分かる、と言うような簡単なものではなく、

・ 簡単に呼べる
・ 技術的には呼べるようだが、実際にはかなり大変
・ 技術的に呼ぶことが出来ない

ものがあり、事前にその辺を十分に評価していないと実際には出来ない処理を出来ると言って逃げ道をなくしてしまうことにもなるので気をつけてください。

まだ物足りないと思いますが、今日はヘルプを入手して、関数の情報を確認する、と言う話までやりました。 次は具体的な呼び出しについてもう少し見ていきます。





コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://hnagasim.blog8.fc2.com/tb.php/249-2b65c52e
    この記事へのトラックバック


    最新記事