スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

LS2CAPI: 構造体を定義する

2009年12月16日 00:04

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


C APIやC言語の関数をLotusScriptで扱うに当たって、構造体をどのように扱うのか不思議に思う方は多いのではないでしょうか。今日はその点について取り上げてみようと思います。

例として、NotesのTIMEDATE型を例にとって見ましょう。
NotesのTIMEDATE型はDBIDやOIDの一部になっていたり、Notesの時間の扱いを理解する上でも非常に重要な型の一つですが、LotusScriptNotesTIMEDATEクラスでもIDのまま見ることはできないのでなかなか分かりにくい事が多いのですが、APIで時間を扱うときはほとんどこの型で処理されます。このIDについてしゃべると長いので別の機会にするとして、どのようなデータ型なのでしょうか?始めに、C API リファレンスで定義を見てみましょう。
TIMEDATEという項目を見ると以下のように定義されているのが分かります。

Definition :
typedef struct tagTIMEDATE {
DWORD Innards[2];
} TIMEDATE;


つまり、TIMEDATE型は、DWORD型の配列である事が分かります。DWORD 型は前回の記事を見るとLong型であることが分かるので、LotusScriptではLong型の配列とすればよさそうです。

LotusScriptでは構造体はユーザー定義型としてマッピングするのですが、ユーザー定義型を宣言するときには、TYPEステートメントを使用します。この辺はVBなどを知っている方の方が聞きなれているかもしれません。

つまり、TIMEDATE型はLotusScript以下のように定義できる事が分かります。
TIMEDATE
Innards(0 To 1) As Long
End Type



ただ、実際は構造体の変換は構造体の中に構造体があったり、関数ポインターを扱っていたりもっともっと複雑なので、何でもLotusScriptに変換できるわけではないので、変換できないこともあると思いますし、機械的に出来るわけではないと思います。

せっかくなので、今日の例を生かして、NotesのC APIで現在の時間を返すOSCurrentTIMEDATEを呼び出してみましょう。時刻はNotesのTIMEDATE型で帰ってくるので見た目は時間である事が分からないので実用性はあまりないと思いますが、どんなAPIなのかは概要がつかめるのではないかと思います。出てくる数字もよくDBIDやUNIDで見かけるような数字の並びになっていることに気が付くのではないかと思います。
サンプルで気をつけて欲しいのは、UIで表示されている順番と、配列の順番が逆になっている事です。

サンプルコード(ボタンスクリプト)
Type TIMEDATE
Innards(0 To 1) As Long
End Type

Declare Sub OSCurrentTIMEDATE Lib "nnotes.dll" (retTime As TIMEDATE)

Sub Click(Source As Button)
Dim curTime As TIMEDATE
Call OSCurrentTIMEDATE(curTime)

' 時刻IDの表示
Msgbox Hex(curTime.Innards(1)) & ":" & Hex(curTime.Innards(0))
End Sub


コメント

    コメントの投稿

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

    トラックバック

    この記事のトラックバックURL
    http://hnagasim.blog8.fc2.com/tb.php/289-3637d469
    この記事へのトラックバック


    最新記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。