朝霧SDK概観
ご使用前にまずアプリケーションとしての朝霧そのもののご理解を深めてください。
それが終わってから次にお進みください。
全体図
開発者様作成プログラムは朝霧にアクセスするためにAsagiri.dllというDLLをロードします。
実はこのDLLをロードするとともにCOMを初期化しなければなりません。
以下に朝霧SDKと朝霧アプリケーションの動作イメージを図示します。
ユーザプログラム、Asagiri.dll、COM、Asagiri.exeの関係をご覧ください。
IAsagiriDispatchインターフェースはCOMインターフェースです。
朝霧SDKがまずはじめにCOMを初期化しなければならない理由はここにあります。
プログラムの流れ
まずDLLの利用者はCoInitializeEx()等の関数でCOMを初期化し、続いてAsagiriInitialize関数でAsagiri.dllを初期化します。
この関数は重複してコールしないでください。つまり一つのプログラムに各一回のコールです。
続いてアイテムを読み込みます。読み込みには列挙関数を使用してください。
この列挙関数はそれぞれのツリー階層ごとに行うようにしてください。
まずAsagiriStartEnum関数で列挙を開始してください。
第二パラメータのnParentIDに親アイテムのIDをセットします。ルートアイテムのIDは必ず0です。この値は不変です。
続いてAsagiriEnumNext関数でどのようなアイテムがあるかを調べてください。
ポップアップアイテムが出現したらそのアイテムのIDをnParentIDにセットしてさらにAsagiriStartEnum関数から始まる列挙をその階層に対しても行ってください。
その階層に対する列挙が終了したらAsagiriStartEnum関数で列挙を終了させてください。
列挙のインデックスをリセットするAsagiriResetEnum関数もありますがあまり使い道は無いでしょう。
これでようやく値の取得、アイテムの作成・削除が可能となります。
値の取得関数はそれぞれAsagiriGetText, AsagiriGetBitmap, AsagiriGetBinary, AsagiriGetImageFileInBinary, AsagiriGetFileNameがありますが、アイテムのタイプに沿った関数をご利用ください。
そしてアイテムの作成にはそれぞれのタイプのアイテム作成関数
AsagiriAddPopup, AsagiriAddText, AsagiriAddBitmap, AsagiriAddBinary, AsagiriAddFileを誤使用ください。
アイテムの削除にはAsagiriRemoveItem関数をご利用ください。
朝霧SDKが作成した文字列バッファとバイナリ列バッファの削除には
AsagiriDeleteString, AsagiriDeleteBinaryをご利用ください。
DLLはリリース版での配布ですが、皆さんが作成されるアプリケーションは当初デバッグ版で作成されるはずです。
コンパイル単位をまたいでメモリのアロケートやフリーを行わないようにするための工夫です。
プログラムが終了する前に必ずAsagiriUninitialize関数でDLLの使用を終了します。
大まかな流れ
なぜCOMをラップするDLLを作成したのか?
朝霧はCOMオートメーションインターフェースを提供しています。
しかしながら現在は不完全なIDispatchの実装が行われております。
これはどういうことかと言いますと、IDispathc::Invoke()コールに対する実装がなされていません。
vtableバインディングのみが現時点ではサポートされています。
またGetActiveObject()関数によるインターフェースの取得のみを許可しており、ライフタイムのコントロールをクライアントに渡さない仕組みをとっております。
もしクライアントプログラムが実行されたとき朝霧が動いていなければCreateProcess()関数を使って起動されるようにDLL内で実装されています。
注意点
自分の作ったアイテムを自分のものとは思わないこと
朝霧では複数のプログラムからアイテムの追加・削除が行われます。
あるプログラムが作成したアイテムを別のプログラムが削除することもあります。さっきまで存在したアイテムのIDが見つからなくなることがあります。
前後関係を意識したロジックには不向きです。操作をする直前に必ず現在のアイテムを列挙関数を利用して取得してください。
2004年7月30日 有限会社コモナ