Dynamic Link Libraries

Top  Previous  Next

データベースにアクセスするダイナミックリンクライブラリを作成する時、4つの違った状況を区別できます:

DLL-only database access

この場合、ホストプログラムは一切のデータベースアクセスをしません。だからDLLはログオン・ログオフのセッションと制御を所有します。このようなDLLと通常のDOAアプリケーションに違いはありません。

DOA DLL sharing a session with a DOA host program

ホストプログラムはTOracleSession を所有し、DLLの外部初期化プロシージャーを通じてDLLにそれを渡すことが出来ます。このDLL初期化プロシージャーはShare プロシージャーを呼び、物理的データベースセッションをホストセッションとローカルデータモジュール内のセッションの間で共有することが出来ます。例えば:

procedure InitSession(HostSession: TOracleSession);

begin

DLLDataModule := TDLLDataModule.Create(nil);

HostSession.Share(DLLDataModule.Session);

end;

 

ホストプログラムとDLLにログオン・ログオフするための厳密な順序があります:

1. ホストプログラムのログオン

2. DLLとセッションを共有

3. (アプリケーション処理)

4. ログオフかDLL内のセッション解放

5. ホストプログラムのログオフ

DOA DLL sharing a session with a non-DOA host program

もし非DOAホストプログラム(例えばPro*Cで書かれたような)とセッションを共有しなければならないDLLを書いている場合、ホストプログラムに存在しないのでTOracleSession を渡すことは出来ません。セッションを共有するためにDLL内のTOracleSession LDA (SQL*Net: Logon Data Area)SVC (Net8: Service Context)へのポインターを渡すことが出来ます。このポインターをTOracleSession.ExternalLDATOracleSession.ExternalSVCプロパティへ割り当てる時、セッションは事実上ログオンされています。このセッションへリンクされている全てのコンポーネントはこのLDASVCと連動します。 nilポインターをExternalLDAExternalSVCに割り当てる時、セッションはログオフされたみなされます。

ホストプログラムとDLLにログオン・ログオフするための厳密な順序があります:

1. ホストプログラム ログオン

2. ExternalLDAExternalSVCに値を割り当てる

3. (アプリケーション処理)

4. ExternalLDAExternalSVCnilを割り当てる

5. ホストプログラム ログオフ

もしExternalLDAExternalSVCnilを割り当てる前にホストプログラム内でログオフすると、DLL内のコンポーネントは解放されたときに"not logged on"エラーを起こします。 なぜならTOracleSession.Connected プロパティは実際の状況を反映しないからです。

Non-DOA DLL sharing a session with a DOA host program

DOA-DLL(例えばPro*C で書かれたような)とセッションを共有する必要があるアプリケーションを書いている場合、ExternalLDA or ExternalSVCプロパティを通じてTOracleSession のLDA (Logon Data Area)SVC (Service Context)へのポインターを取得することが出来ます。DLLLDASVCを所得するためのプロシージャーを提供する必要があります。