スポンサーサイト

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

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

OSの違いを吸収する

2011年02月13日 02:15

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

しばらく書いていませんでしたが、ちょっと書こうと思っていた記事があったのを思い出しました。
LotusScriptからC APIを呼び出すようなプログラムをノーツアプリケーションに移植すると一気に移植性が損なわれてしまう、と思った方はいないでしょうか?

このように書くと、nnotes.dllはWindowsのDLL名なので、その関数はWindowsでしか使えなくなってしまいます。
Declare Function NSFDbOpen Lib "nnotes.dll" ( _
Byval PathName As String, rethDB As Integer ) As Integer


しかもLib宣言はif文で分けるようなことはできません。
このような問題はどのように回避するのでしょうか?

ちょっとこのような問題をどう解決するのかを見ていくために、DJX管理ツールを見てみましょう。
ここではユーザー登録などをノーツアプリケーションから実行するために一部APIを使用しています。

APIFunctionsDef と言うスクリプトライブラリでは以下のように宣言されています。
(一部抜粋)

'###################################
' Declarations of Notes C API functions
'###################################
Const LIBNAME_WIN = "nnotes.dll"
Const LIBNAME_ALP = "anotes.dll"
Const LIBNAME_OS2 = "inotes.dll"
Const LIBNAME_SOL = "libnotes.so"
Const LIBNAME_AIX = "libnotes_r.a"
Const LIBNAME_OS400 = "/qsys.lib/qnotes.lib/libnotes.srvpgm"
Const LIBNAME_LINUX = "libnotes.so"
//略
Declare Function NSFDbOpen_WIN Lib LIBNAME_WIN Alias "NSFDbOpen" ( _
Byval PathName As String, rethDB As Integer ) As Integer

Declare Function NSFDbOpen_SOL Lib LIBNAME_SOL Alias "NSFDbOpen" ( _
Byval PathName As String, rethDB As Integer ) As Integer

Declare Function NSFDbOpen_AIX Lib LIBNAME_AIX Alias "NSFDbOpen" ( _
Byval PathName As String, rethDB As Integer ) As Integer

Declare Function NSFDbOpen_OS400 Lib LIBNAME_OS400 Alias "NSFDbOpen" ( _
Byval PathName As String, rethDB As Integer ) As Integer

Declare Function NSFDbOpen_LINUX Lib LIBNAME_LINUX Alias "NSFDbOpen" ( _
Byval PathName As String, rethDB As Integer ) As Integer



上記はNSFDBOpenの呼び出し例です。プラットフォームごとに異なる名前をAliasで付けています。
勘のいい人であればここまで見れば、だいたいどう処理するか分かるのではないでしょうか?

TransactionLib ではNSFDbOpenの下記のようなラッパー関数を作っています。

Function NSFDbOpen( PathName As String, rethDB As Integer ) As Integer
Select Case PLATFORM
Case WIN32
ret% =NSFDbOpen_WIN( PathName, rethDB )
Case SOLARIS
ret% =NSFDbOpen_SOL( PathName, rethDB )
Case AIX
ret% =NSFDbOpen_AIX( PathName, rethDB )
Case OS400
ret% =NSFDbOpen_OS400( PathName, rethDB )
Case LINUX
ret% =NSFDbOpen_LINUX( PathName, rethDB )
End Select
NSFDbOpen = ret%
End Function


ここでのPLATFORMと言う定数は@Platformの結果を格納しているような変数ですがここは人によってどうにでも実装できるのではないかと思います。(詳細が気になる人はDefaultSettingと言う関数を見てみてください)
「OS毎の処理の違いはラッパー関数で吸収する」と言ってしまえば、何てことない話ですがこういう処理の仕方は参考になりますね。





コメント

    コメントの投稿

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

    トラックバック

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


    最新記事


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