fc2ブログ

LS2CAPI: 型を変換する

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

 C API 関数を呼び出す上で次に必要になるのはC言語での型からLotusScriptの型に変換する方法です。
先に結論から言ってしまうと、実際的には以下のようなサイトから変換表を借りるのが一番省エネな方法なのではないかと思います。

Translating API Data Types to LotusScript (nsftools)

ただ、一度どのようにこれらの変換を考えるかはゆっくり精査してみるといいと思います。
たとえば、ここの表を見ると、Windows などでよく使われるDWORD型はLotusScriptではLong型に対応付けられています。

DWORD というのは一般的には unsigned long なので、 0 ? 4294967295 までの数を表します。
LotusScriptでのLongデータ型は、 -2,147,483,648 以上 2,147,483,647 以下の整数なので厳密にはマッチしません。
ただ、デザイナーヘルプをよく見てみると、「引数を C 関数へ引き渡す」と言う項にLongデータ型はC関数に渡すときに「4 バイトの Long 型の値が呼び出しスタックに push されます」とあるので、LotusScriptのLong型はマイナス値を渡したときの振る舞いはよく分からないですが、正の値を渡している場合には4バイトの数として扱ってくれるようです。一般的にはNotesに限らずAPI呼び出しなどを行う場合にこのようなことをするとクラッシュしてしまいます。
 この辺については色々理屈にこだわるより慣習に従った方がいいのではないかと思います。。

あとはたとえばC APIでは「STATUS型」などを関数の戻り値にしているのをよく見かけます。
こういうのを見かけたら、API リファレンスを探してみましょう。ちゃんと「STATUS」と言う項目に以下のような説明があるのが分かります。

Definition :
typedef WORD STATUS;

つまり、これは WORD型 = unsigned short と同じ、Integer型になっているのが分かると思います。
と言うわけで型変換は毎回一からやっているととても大変なのでこのようなものは書き溜めておくと便利なのではないかと思います。

また、LotusScriptの型はC 言語ほど豊富ではないのでLotusScriptからC API関数を呼び出すことはある程度技術的にも限界があることなんだ、と言う事は念頭に入れた上で挑戦してみたほうがよいと思います。
ブロガーの方が試行錯誤した上で色々な型変換の表を色々なところで公開してもらえると楽しそうですよね。

コメント

非公開コメント