WebOTX Manual V11.1 (第6版) 目次を表示 |
WebOTXはVisual Basicで開発したクライアントアプリケーションから、CORBAサーバアプリケーションの通信を実現するCORBAゲートウェイを提供しています。本節では、CORBAゲートウェイを利用したアプリケーションの開発方法について説明します。
%systemroot%\syswow64\regedit
CORBAゲートウェイはVisual Basic 6.0, Visual Basic .NET, Visual Basic 2005〜2015, Active Server Pagesをサポートしています。
Memo 以下の説明では、Visual Basic 6.0は「VB6.0」、Visual Basic .NET以降(Visual Basic 2005〜2015を含む)は「VB.NET」、Active Server Pagesは「ASP」と省略しています。
CORBAゲートウェイと関連コンポーネントの概要図を次に示します。
CORBAゲートウェイの概要図
図の水色で示す値は、通信に使用するポート番号です。コンポーネント間の通信で使用するプロトコルとポート番号は次の通りです。
クライアント | サーバ | プロトコル | |
---|---|---|---|
Webブラウザ | Webサーバ | HTTP | HTTPは 80 SSL使用時のHTTPSは 443 |
ダウンローダ | Webサーバ | ||
Object Broker C++ | oad | IIOP | 9825 |
Object Broker C++ | 名前サーバ | IIOP | 2809 |
Object Broker C++ | IIOPリスナ | IIOP | 5151 |
Memo
通信にはCORBAの標準プロトコルであるIIOP (Internet Inter-
名前サーバのホスト名はorbcustmの[詳細設定]ダイアログで設定します。
orbcustmについては、
[リファレンス
> コマンドリファレンス
> CORBA通信基盤(Object Broker)]
を参照してください。
CORBAゲートウェイの提供機能は次の通りです。
.
BridgeオブジェクトAPIなどを提供します。
|
以下に使用可能なデータ型について説明します。
CORBAゲートウェイで使用可能なデータ型のマッピングは次の通りです。
IDL型 | VB6.0型 | VB.NET型 | .NET System型 | Java型 | C++型 | in, out, inout, |
sequence, |
---|---|---|---|---|---|---|---|
void | 省略 | 省略 | System. |
void | void | ○ | − |
octet | Byte | Byte | System. |
byte | CORBA:: |
○ | ○ |
short | Integer | Short | System. |
short | CORBA:: |
○ | ○ |
unsigned short | Integer | UShort注3 | System. |
short注4 | CORBA:: |
○ | ○注5 |
long | Long | Integer | System. |
int | CORBA:: |
○ | ○ |
unsigned long | Long | UInteger注3 | System. |
int注4 | CORBA:: |
○ | ○注5 |
long long | − | Long | System. |
long | CORBA:: |
○ | ○ |
unsigned long long | − | ULong注3 | System. |
long注4 | CORBA:: |
○ | ○ |
float | Single | Single | System. |
float | CORBA:: |
○ | ○ |
double | Double | Double | System. |
double | CORBA:: |
○ | ○ |
boolean | Boolean | Boolean | System. |
boolean | CORBA:: |
○ | ○ |
char注6,7 | Byte | Byte | System. |
char | CORBA:: |
○ | ○ |
string注7 | String | String | System. |
String | char* | ○ | ○ |
wchar注8 | Integer | UShort注3 | System. |
char | CORBA:: |
○ | ○注5 |
wstring注8 | String | String | System. |
String | CORBA:: |
○ | ○ |
struct注9 | Object | Object | System. |
class | class | ○ | ○ |
enum注10 | Long | UInteger注3 | System. |
class | enum | ○ | ○ |
Object注11 | Object | Object | System. |
CORBA. |
CORBA:: |
戻り値 |
× |
any, union | − | − | − | × | × | × | × |
Dim Var() As xxxxx
で宣言します。Set Obj = インタフェース名.オペレーション
開発環境と実行環境の環境構築 および、動作環境の設定について説明します。
開発環境にCORBAゲートウェイをインストールする方法は次の通りです。
実行環境(開発環境で作成したアプリケーションを実行する環境)にCORBAゲートウェイをインストールするには次の2通りの方法があります。
CORBAゲートウェイの動作を変更する方法について説明します。
次のような設定単位と優先順位があり、アプリケーションで設定する方法とクライアントのレジストリを編集する方法があります。
アプリケーション単位で設定 >> ユーザ単位で設定 >> マシン単位で設定 |
CORBAゲートウェイが提供するAPIを使用することにより、アプリケーション単位に動作を変更することができます。
編集するレジストリキーによって、有効範囲をユーザ単位とマシン単位に設定できます。
有効範囲 | レジストリキー |
---|---|
ユーザ単位 | HKEY_CURRENT_USER\Software\NEC\WebOTX\ClientBridge |
マシン単位 | HKEY_LOCAL_MACHINE\Software\NEC\WebOTX\ClientBridge |
Caution
ASPアプリケーションの場合、マシン単位の設定のみ有効です。
対象のクライアントで上記のレジストリキーを作成し、この配下に値を設定することにより、動作を変更することができます。レジストリに設定する内容は次の通りです。
名 前 | 種 類 | 値(既定値) |
---|---|---|
TraceFilename | 文字列 (REG_SZ) |
取得するトレースファイル名orbclbrg.log )255文字以内の文字列を設定します。 出力先の既定値は、VBアプリケーションは作業フォルダ(カレントディレクトリ)で、ASPアプリケーションはシステム環境変数 出力先を変更するには、ファイル名をフルパスで指定してください。 |
TraceLevel | DWORD (REG_DWORD) |
トレースのレベル
|
TraceSize | DWORD (REG_DWORD) |
トレースサイズの上限 トレースサイズの上限をKバイト単位で設定します。この上限を超えると、ファイル名の末尾に「 .bak 」を付加してバックアップし、新しいトレースファイルを作成します。 |
TraceMulti | DWORD (REG_DWORD) |
プロセス別にトレースファイルを分割する
|
MaxObject | DWORD (REG_DWORD) |
オブジェクト数の上限 システムに過剰な負荷を与えるのを防止するため、オブジェクト数には上限値が設定されています。 既定値から拡張する場合、2049〜65535の範囲で設定します。 上限を超えると、エラー A1028108が発生します。 |
Factory | DWORD (REG_DWORD) |
オブジェクト作成時にファクトリを使用する
|
NameServiceGroup | 文字列 (REG_SZ) |
名前サービス登録グループ名 名前サーバ登録名の既定値に含まれる "WO_Default"の部分がグループ名に相当します。複数のサーバで構成されるシステムの場合、このグループ名を変更して登録することにより、任意のサーバをグルーピングすることができます。このグループ名を設定することにより、アクセスするサーバを選択することができます。 |
CacheFlag | DWORD (REG_DWORD) |
オブジェクトキャッシュ機能を使用する
|
NameServiceHostList | 文字列 (REG_SZ) |
名前サーバのホスト名 511文字以内の文字列を設定します。 キャシュ名前サービスなどで複数の名前サービスを利用する場合、カンマ「,」区切りで複数ホスト名を記述します。 |
AliveCheck | DWORD (REG_DWORD) |
アライブチェックを行う
|
AsyncMessage | DWORD (REG_DWORD) |
非同期メッセージ機能を使用する
|
CORBAゲートウェイの通信に必要なネットワーク設定について説明します。
ファイル名 | 機能名 | |
---|---|---|
80/TCP (既定値) |
Webサーバのファイル名を指定します。 IISの場合、登録済みの名前から「Web サーバー」または、「World Wide Web サービス」を選択します。 IIS以外の場合はWebサーバのマニュアルを参照して、該当するファイル名を確認してください。 | Webサーバ |
9825/TCP (既定値) |
\ |
oad |
2809/TCP (既定値) |
\ |
名前サーバ |
5151/TCP (既定値) |
\ |
IIOPリスナ |
クライアントからサーバに発行したメソッド等のリクエストは既定で30秒の最大待ち時間(タイムアウト)があり、この時間に応答がない場合は、エラー A1028117が発生します。
最大待ち時間を既定値の30秒から変更する場合、クライアントのレジストリに Object BrokerのRequestTimeoutを適用してください(値がない場合は作成してください)。 または、APIのSetTimeoutで設定してください。APIの設定はObject BrokerのRequestTimeoutより優先します。
レジストリキー | HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectBroker\<バージョン識別子> | |
---|---|---|
名 前 | 種 類 | 値(既定値) |
RequestTimeout | 文字列 (REG_SZ) |
メソッド呼び出しのタイムアウト タイムアウト時間を秒単位で設定します。 処理が戻るまで待つ場合は0を設定します。 高負荷時を考慮して10秒以下は設定しないでください。 |
受信データが8M(8,388,608)バイトを超える場合、クライアントのレジストリに Object BrokerのMaxMessageSizeを適用してください(値がない場合は作成してください)。
ただし、サーバ側の送受信上限値 99,999,998(約100M)バイトを超えるデータを受信することはできません。 詳細については、 [構築・運用 > チューニング > 電文長の長いメッセージの送受信 ] を参照してください。
レジストリキー | HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectBroker\<バージョン識別子> | |
---|---|---|
名 前 | 種 類 | 値(既定値) |
MaxMessageSize | 文字列 (REG_SZ) |
受信データの上限(既定値: 8388608バイト) 既定値から拡張する場合、バイト単位で 8388609〜99999998の範囲を指定します。 |
WebOTX Ver6.1から Object BrokerのAddWstringWidthOctetプロパティの既定値が trueから falseに変更されました。このため、IDL内に wstringを含み、WebOTX Ver6.2以降のクライアントからVer5.3以前のサーバに接続する場合、クライアントのAddWstringWidthOctetプロパティの値をtrueに設定してください。
クライアントのAddWstringWidthOctetプロパティを設定するには、次のレジストリ内容をクライアントに適用してください(値がない場合は作成してください)。
レジストリキー | HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectBroker\<バージョン識別子> | |
---|---|---|
名 前 | 種 類 | 値(既定値) |
AddWstringWidthOctet | 文字列 (REG_SZ) |
true (既定値: false) |
CORBAゲートウェイを用いたVisual Basicアプリケーションの開発には、事前準備としてIFファイルを使用してCORBAゲートウェイの制御ファイル(GC1, TLB)を生成する必要があります。 IFファイルとはIDLコンパイラが生成するファイルです。
CORBAゲートウェイを用いたVisual Basicアプリケーションの開発には、事前準備として次のような手順が必要になります。
|
1〜3.の手順については、[CORBAアプリケーション > WebOTX AS CORBAアプリケーション]を参照してください。 作成したCORBAサーバアプリケーションを配備する方法については、 [配備 > アプリケーション配備 > 配備・再配備・置換] を参照してください。
Caution
CORBAサーバアプリケーションがR5形式でファクトリを使用する場合は、オブジェクトを生成/解放するメソッド名をそれぞれ、CreateServerObject, ReleaseServerObjectにする必要があります。
以下、「4. 制御ファイル(GC1, TLB)の生成と登録」について説明します。
制御ファイルの生成と登録には次の2通りの方法があります。
登録により制御ファイル (GC1, TLB) のパス情報がレジストリに記録されます。このため、制御ファイル (GC1, TLB) は削除しないでください。移動した場合は、移動後に再登録してください。
以降は開発評価向けの方法について説明します。本番運用向けのクライアント配布環境を作成する方法については、 [ Download Contents > 運用ガイド ] を参照してください。
IFコンパイラ(woifgenコマンド)は次のように使用します。コマンドの詳細については、[コマンドリファレンス]を参照してください。
[例] サンプルのIDLファイルから生成したIFファイルの場合
woifgen loopback.if → loopback.gc1とloopback.tlbが生成・登録されます。 |
Caution
Windows Vista以降でUAC(ユーザアカウント制御)が有効の場合、IFコンパイラがUACの影響を受けることがあります。詳しくは、[コマンドリファレンス]の注意事項を参照してください。
CORBAゲートウェイのAPIを利用するには WebOTX.
Bridgeオブジェクトを使用する必要があります。
WebOTX.
Bridgeオブジェクトを生成するには次の2つの方法があります。
|
1.はVisual Basicで使用できます。2.はVisual Basic および、ASPで使用できます。
Memo クライアントAPIの詳細(リファレンス)については、 [リファレンス > API > WebOTXが提供するAPI > CORBA > CORBA, EJBゲートウェイ] を参照してください。
VB6.0の場合は[プロジェクト]/[参照設定]メニューから[参照設定]ダイアログを開き、[参照可能なライブラリファイル]から "NEC COM/CORBA Bridge Object Library"を選択し、[OK]ボタンを押します。
VB6.0の[参照設定]ダイアログ
VB.NETの場合は[プロジェクト]/[参照の追加]メニューから[参照の追加]ダイアログを開き、[COM]タブ内から "NEC COM/CORBA Bridge Object Library"を選択し、[選択]ボタンに続けて、[OK]ボタンを押します。
VB 2008の[参照の追加]ダイアログ
Newによる WebOTX.
Bridgeオブジェクトの生成処理は、次のようになります。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim Bridge As WebOTX.Bridge 'WebOTX.Bridgeオブジェクトの生成 Set Bridge = New WebOTX.Bridge |
次にオブジェクトライブラリのメソッドをコーディングします。オブジェクトライブラリ変数を記述すると次のように使用できるメソッド一覧が表示されます。使用したいAPIを選択してください。ここでは構造体を作成するCreateTypeを選択します。
入力支援機能による APIの選択 (VB6.0)
CreateTypeを選択すると、CreateTypeのパラメータ情報が次のように表示されます。表示された情報に従ってパラメータを記述してください。
入力支援機能によるパラメータの選択 (VB6.0)
CreateObject関数による WebOTX.
Bridgeオブジェクトの生成処理は、次のようになります。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim Bridge As Object 'WebOTX.Bridgeオブジェクトの生成 Set Bridge = CreateObject("WebOTX.Bridge") [ASP]
Dim Bridge
'WebOTX.Bridgeオブジェクトの生成
Set Bridge = Server.CreateObject("WebOTX.Bridge")
|
CreateObject関数によるオブジェクト生成は遅延(レイト)バインディングになるため、Newメソッドを使用する事前(アーリー)バインディングと異なり、コーディング時の入力支援機能は利用できません。
CORBAゲートウェイを用いたVisual Basicアプリケーションの開発について説明します。
処理毎に以下の項目に分けて説明します。
クライアント側のサンプルソースは、マニュアルのサンプルをインストールしたディレクトリ配下のsamples
に格納されています。
以下に各項目について説明します。
クライアントアプリケーションは通常のVisual Basicアプリケーションと同じように作成します。クライアントアプリケーションは、サーバオブジェクトに対応したCOMオブジェクトを使用することにより、アプリケーションサーバ上のサーバオブジェクトを利用することができます。
CORBAゲートウェイの基本的な使用方法として、サーバオブジェクトの作成から解放までに必要な処理は次のようになります。
|
以下に各処理手続きについて説明します。
[VB6.0, VB.NET]
Dim SvrObj As Object 'サーバオブジェクト
|
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) 'サーバオブジェクトの生成 Set SvrObj = CreateObject("WebOTX.sample_LoopBackSample") |
WebOTX.module名_module名_…_interface名
|
[VB6.0, VB.NET]
'サーバメソッドの呼び出し
retval = SvrObj.LoopBack(inData, outData)
|
Err.Number
によりエラー番号を取得できますが、 VB.NETの場合にエラー番号を取得するには、Runtime . InteropServices . COMException
クラスのErrorCode
プロパティを使用します。
[VB6.0]
Private Sub Command1_Click()
On Error GoTo Exception
:
Exit Sub
Exception:
'エラーメッセージとエラー番号の出力
Call MsgBox(Err.Description & vbCr & "ErrCode:" & _
Hex(Err.Number), vbExclamation)
End Sub
[VB.NET]
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Try : Catch ex As Runtime.InteropServices.COMException 'エラーメッセージとエラー番号の出力 MsgBox(ex.ToString & vbCr & "ErrCode:" & _ Hex(ex.ErrorCode), MsgBoxStyle.Exclamation) Catch ex As Exception 'エラーメッセージの出力 MsgBox(ex.ToString, MsgBoxStyle.Exclamation) Finally : End Try End Sub |
Memo エラー内容の詳細については、 [例外 > CORBA > CORBA, EJBゲートウェイのエラー一覧] を参照してください。
System . Runtime . InteropServices . Marshal . FinalReleaseComObject()
または、ReleaseComObject()
により明示的にオブジェクトを解放するか、System . GC . Collect()
によりガベージ コレクションを実行してください。
[VB6.0]
'各オブジェクトの解放
Set Person = Nothing
Set SvrObj = Nothing
[VB 2005以降: 明示的に解放]
Imports System.Runtime.InteropServices.Marshal
:
'各オブジェクトを明示的に解放
If Not Person Is Nothing Then
FinalReleaseComObject(Person)
Person = Nothing
End If
If Not SvrObj Is Nothing Then
FinalReleaseComObject(SvrObj)
SvrObj = Nothing
End If
[VB.NET 2003以前: 明示的に解放]
Imports System.Runtime.InteropServices.Marshal
:
'各オブジェクトを明示的に解放
If Not Person Is Nothing Then
Do While ReleaseComObject(Person) > 0
Loop
Person = Nothing
End If
If Not SvrObj Is Nothing Then
Do While ReleaseComObject(SvrObj) > 0
Loop
SvrObj = Nothing
End If
[VB.NET: GCにより解放]
'各オブジェクトをGCにより解放 Person = Nothing SvrObj = Nothing 'ガベージ コレクション実行 GC.Collect() |
以上のまとめたサンプルコーディングを次に示します。
[VB6.0]
Private Sub Command1_Click() '変数の宣言 Dim SvrObj As Object 'サーバオブジェクト Dim inData As String Dim outData As String Dim retval As Long On Error Goto Exception 'サーバオブジェクトの生成 Set SvrObj = CreateObject("WebOTX.sample_LoopBackSample") inData = "LoopBack DATA DaTa dAtA" 'サーバメソッドの呼び出し retval = SvrObj.LoopBack(inData, outData) GoTo Finally Exception: 'エラーメッセージとエラー番号の出力 Call MsgBox(Err.Description & vbCr & "ErrCode:" & _ Hex(Err.Number), vbExclamation) Finally: 'オブジェクトの解放 Set SvrObj = Nothing End Sub [VB.NET]
Imports System.Runtime.InteropServices.Marshal Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click '変数の宣言 Dim SvrObj As Object 'サーバオブジェクト Dim inData As String Dim outData As String Dim retval As Long Try 'サーバオブジェクトの生成 SvrObj = CreateObject("WebOTX.sample_LoopBackSample") inData = "LoopBack DATA DaTa dAtA" 'サーバメソッドの呼び出し retval = SvrObj.LoopBack(inData, outData) Catch ex As Runtime.InteropServices.COMException 'エラーメッセージとエラー番号の出力 MsgBox(ex.ToString & vbCr & "ErrCode:" & _ Hex(ex.ErrorCode), MsgBoxStyle.Exclamation) Catch ex As Exception 'エラーメッセージの出力 MsgBox(ex.ToString, MsgBoxStyle.Exclamation) Finally 'オブジェクトの解放(明示的に解放) If Not SvrObj Is Nothing Then FinalReleaseComObject(SvrObj) SvrObj = Nothing End If End Try End Sub |
IDL定義で可変長配列を定義するには、sequenceを使用します。例えば文字列の可変長配列を使用する場合、次のようにIDLを定義します。
[IDLファイル: *.idl]
module sample { interface sampleSequence { typedef sequence<wstring> NameList; void entry(in NameList a); void search(out NameList b); }; }; |
Memo C++のサーバアプリケーションで文字列を使用する場合は、stringを使用してください。
Visual Basicでは NameListに対応する変数を次のように宣言してください。
[VB6.0, VB.NET]
Dim a() As String |
sequence型を使用する場合は必ず要素数なしの変数を宣言する必要があります。要素数を指定した場合は可変長配列として動作しません。
Visual Basicでは配列の添え字+1が要素数になるため、入力パラメータ、入出力パラメータとしてn個の要素を使用する場合、次のように要素数を設定してください。
[VB6.0, VB.NET]
ReDim a(n-1) |
要素数を設定した後に0番目の要素からn-1番目までの要素にデータを設定してください。
入出力パラメータ、出力パラメータ、返却値を受け取る場合、要素数は次のようにUBound()で取得することができます。
[VB6.0, VB.NET]
For i = 0 to UBound(b)
person = b(i) '要素の取得
Next
|
IDL定義で固定長配列を定義するには、配列を示す括弧([ ])を使用します。例えば文字列の固定長配列を使用する場合、次のようにIDLを定義します。
[IDLファイル: *.idl]
module sample { interface sampleSequence { typedef wstring NameList[2]; void entry(in NameList a); void search(out NameList b); }; }; |
Visual Basicでは配列の添え字+1が要素数になるため、IDL定義と同じ要素数になるように、IDL定義の値-1の値を添え字に使用します。
[VB6.0, VB.NET]
Dim a(1) As String 'IDL定義値-1を添え字とする
|
入出力パラメータ、出力パラメータ および、返却値に対する各要素の取り扱いは、可変長配列を使用した場合と同様に処理することができます。
IDL定義で可変長多次元配列を定義するには、可変長配列を定義したものに対してsequenceを使用します。例えば文字列の可変長2次元配列を使用する場合、次のようにIDLを定義します。
[IDLファイル: *.idl]
module sample { interface sampleArray { typedef sequence<wstring> NameList; typedef sequence<NameList> NameListArr; void entry(in NameListArr a); void search(out NameListArr b); }; }; |
Memo C++のサーバアプリケーションで文字列を使用する場合は、stringを使用してください。
Visual Basicでは NameListArrに対応する変数を次のように宣言してください。
[VB6.0, VB.NET]
Dim a(,) As String |
sequence型を使用する場合は必ず要素数なしの変数を宣言する必要があります。要素数を指定した場合は可変長多次元配列として動作しません。
Visual Basicでは配列の添え字+1が要素数になります。可変長2次元配列を例にすると、入力パラメータ、入出力パラメータとしてm個、n個の要素を使用する場合、次のように要素数を設定してください。
[VB6.0, VB.NET]
ReDim a(m-1, n-1) |
要素数を設定した後に0番目の要素からm-1、n-1番目までの要素にデータを設定してください。
入出力パラメータ、出力パラメータ、返却値を受け取る場合、要素数は次のようにUBound()で取得することができます。
[VB6.0, VB.NET]
For i = 0 to UBound(b)
For j = 0 to UBound(b, 2)
person = b(i, j) '要素の取得
Next
Next
|
IDL定義で固定長多次元配列を定義するには、配列を示す括弧([ ])を使用します。例えば文字列の固定長2次元配列を使用する場合、次のようにIDLを定義します。
[IDLファイル: *.idl]
module sample { interface sampleArray { typedef wstring NameListArr[2][2]; void entry(in NameListArr a); void search(out NameListArr b); }; }; |
Visual Basicでは配列の添え字+1が要素数になるため、多次元配列の各次元でIDL定義と同じ要素数になるように、IDL定義の値-1を添え字に使用します。
[VB6.0, VB.NET]
Dim a(1, 1) As String 'IDL定義値-1を添え字とする
|
入出力パラメータ、出力パラメータ および、返却値に対する各要素の取り扱いは、可変長多次元配列を使用した場合と同様に処理することができます。
IDL定義ではstructを使用します。例えば社員番号と社員名を構造体として使用する場合は次のようにIDLを定義します。
[IDLファイル: *.idl]
module sample { interface sampleStruct { struct person { long id; wstring name; }; void add(in person p); void search(in long id, out person p); }; }; |
Visual Basicではpersonに対応する変数を次のようにObject型で宣言します。
[VB6.0, VB.NET]
Dim Person As Object |
入力パラメータ、入出力パラメータに構造体を使用するには、WebOTX.
Bridgeの CreateTypeメソッドにより、変数を構造体として初期化する必要があります。メソッドを実行すると、Object型の変数は構造体の要素をプロパティとして持つCOMオブジェクトに初期化されます。構造体の名前には次のような命名規則があります。
|
CORBAゲートウェイのWebOTX.
Bridgeオブジェクトの使用方法は、[クライアントAPIの使用方法]を参照してください。
上記のIDL定義では次のようなコーディングになります。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim Bridge As WebOTX.Bridge 'WebOTX.Bridgeオブジェクト Dim Person As Object '構造体 Set Bridge = New WebOTX.Bridge 'WebOTX.Bridgeオブジェクトの生成 Set Person = Bridge.CreateType("sample_sampleStruct::person") |
変数Personは構造体の要素をプロパティとして持つCOMオブジェクトとして初期化されます。構造体の要素に値を代入するには構造体の要素名を使用します。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) '変数の宣言 Dim Bridge As WebOTX.Bridge 'WebOTX.Bridgeオブジェクト Dim SvrObj As Object 'サーバオブジェクト Dim Person As Object '構造体 Set Bridge = New WebOTX.Bridge 'WebOTX.Bridgeオブジェクトの生成 Set Person = Bridge.CreateType("sample_sampleStruct::person") Person.id = 12345 '要素に設定 Person.name = "日電太郎" '要素に設定 Set SvrObj = CreateObject("WebOTX.sample_sampleStruct") Call SvrObj.Add(Person) 'サーバメソッド呼出し |
出力パラメータ、返却値として構造体を使用するには、パラメータとしてObject型変数を指定します。初期化する必要はありません。メソッド実行後に、要素に値が設定されます。構造体の要素の値を参照するには構造体の要素名を使用します。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim SvrObj As Object 'サーバオブジェクト Dim Person As Object '構造体 Dim id As Long '社員番号 Dim name As String '社員名 Set SvrObj = CreateObject("WebOTX.sample_sampleStruct") Call SvrObj.Search(1234, Person) 'サーバメソッド呼出し id = Person.id '要素の取得 name = Person.name '要素の取得 |
構造体を配列で使用するには、構造体以外を配列で使用する場合と比べて、実装方法が異なります。次に例を示します。
[IDLファイル: *.idl]
module sample { interface sampleStructSeq { struct person { long id; boolean married; wstring name; }; typedef sequence<person> persons; void entry(in persons ps); void search(in boolean married, out persons ps); }; }; |
入力パラメータ、入出力パラメータとして構造体の配列を使用するには、配列の要素をすべて構造体として初期化する必要があります。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim Bridge As WebOTX.Bridge 'WebOTX.Bridgeオブジェクト Dim SvrObj As Object 'サーバオブジェクト Dim Persons() As Object '構造体 Set Bridge = New WebOTX.Bridge 'WebOTX.Bridgeオブジェクトの生成 Set SvrObj = CreateObject("WebOTX.sample_sampleStructSeq") ReDim Persons(2) For i = 0 To UBound(Persons) Set Persons(i) = Bridge.CreateType("sample_sampleStructSeq::person") Persons(i).id = MSFlexGrid1.TextMatrix(1, i) Persons(i).married = CBool(MSFlexGrid1.TextMatrix(2, i)) Persons(i).name = MSFlexGrid1.TextMatrix(3, i) Next Call SvrObj.entry(Persons) 'サーバメソッド呼出し |
出力パラメータ、返却値として構造体の配列を使用するには、パラメータとしてObject型変数の配列を指定します。初期化する必要はありません。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim SvrObj As Object 'サーバオブジェクト Dim Persons() As Object '構造体 Set SvrObj = CreateObject("WebOTX.sample_sampleStructSeq") Call SvrObj.search(True, Persons) 'サーバメソッド呼出し For i = 0 to UBound(Persons) MSFlexGrid1.TextMatrix(1, i) = Persons(i).id MSFlexGrid1.TextMatrix(2, i) = Persons(i).married MSFlexGrid1.TextMatrix(3, i) = Persons(i).name Next Erace Persons '配列初期化 |
固定長配列を使用することもできます。固定長配列を使用する場合、次のようにIDLを定義します。
[IDLファイル: *.idl]
module sample { interface sampleStructSeq { struct person { long id; boolean married; wstring name; }; typedef person persons[2]; void entry(in persons ps); void search(in boolean married, out persons ps); }; }; |
Visual Basicでは配列の添え字+1が要素数になるため、IDL定義と同じ要素数になるように、IDL定義の値-1の値を添え字に使用します。
[VB6.0, VB.NET]
Dim Persons(1) As Object 'IDL定義値-1を添え字とする
|
入力パラメータ、入出力パラメータ および、出力パラメータに対する各要素の取り扱いは、可変長配列を使用した場合と同様に処理することができます。
構造体を多次元配列で使用するには、構造体以外を多次元配列で使用する場合と比べて、実装方法が異なります。次に、構造体の可変長2次元配列の例を示します。
[IDLファイル: *.idl]
module sample { interface sampleStructArr { struct person { long id; boolean married; wstring name; }; typedef sequence<person> persons; typedef sequence<persons> personArr; void entry(in personArr ps); void search(in boolean married, out personArr ps); }; }; |
入力パラメータ、入出力パラメータとして構造体の多次元配列を使用するには、多次元配列の要素をすべて構造体として初期化する必要があります。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim Bridge As WebOTX.Bridge 'WebOTX.Bridgeオブジェクト Dim SvrObj As Object 'サーバオブジェクト Dim PersonArr(,) As Object '構造体 Set Bridge = New WebOTX.Bridge 'WebOTX.Bridgeオブジェクトの生成 Set SvrObj = CreateObject("WebOTX.sample_sampleStructArr") ReDim PersonArr(2, 2) For i = 0 To UBound(PersonArr) For j = 0 To UBound(PersonArr, 2) Set PersonArr(i, j) = Bridge.CreateType("sample_sampleStructArr::person") PersonArr(i, j).id = MSFlexGrid1.TextMatrix(i, j) PersonArr(i, j).married = CBool(MSFlexGrid1.TextMatrix(i, j)) PersonArr(i, j).name = MSFlexGrid1.TextMatrix(i, j) Next Next Call SvrObj.entry(PersonArr) 'サーバメソッド呼出し |
出力パラメータ、返却値として構造体の多次元配列を使用するには、パラメータとしてObject型変数の多次元配列を指定します。初期化する必要はありません。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim SvrObj As Object 'サーバオブジェクト Dim PersonArr(,) As Object '構造体 Set SvrObj = CreateObject("WebOTX.sample_sampleStructArr") Call SvrObj.search(True, PersonArr) 'サーバメソッド呼出し For i = 0 to UBound(PersonArr) For j = 0 to UBound(PersonArr, 2) MSFlexGrid1.TextMatrix(i, j) = PersonArr(i, j).id MSFlexGrid1.TextMatrix(i, j) = PersonArr(i, j).married MSFlexGrid1.TextMatrix(i, j) = PersonArr(i, j).name Next Next Erace PersonArr '配列初期化 |
固定長多次元配列を使用することもできます。固定長2次元配列を使用する場合、次のようにIDLを定義します。
[IDLファイル: *.idl]
module sample { interface sampleStructArr { struct person { long id; boolean married; wstring name; }; typedef person personArr[2][2]; void entry(in personArr ps); void search(in boolean married, out personArr ps); }; }; |
Visual Basicでは配列の添え字+1が要素数になるため、IDL定義と同じ要素数になるように、IDL定義の値-1の値を添え字に使用します。
[VB6.0, VB.NET]
Dim PersonArr(1, 1) As Object 'IDL定義値-1を添え字とする
|
入力パラメータ、入出力パラメータ および、出力パラメータに対する各要素の取り扱いは、可変長多次元配列を使用した場合と同様に処理することができます。
構造体の要素中に構造体を使用する場合について説明します。次に例を示します。
[IDLファイル: *.idl]
module sample { interface sampleNestStruct { struct auth { long id; wstring password; }; struct person { auth account; boolean married; wstring name; }; void entry(in person ps); void search(in boolean married, out person ps); }; }; |
構造体中の構造体を使用する場合は、子の構造体を生成して値を設定してから、親の構造体に代入します。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim Bridge As WebOTX.Bridge 'WebOTX.Bridgeオブジェクト Dim SvrObj As Object 'サーバオブジェクト Dim account As Object '子の構造体 Dim person As Object '親の構造体 Set Bridge = New WebOTX.Bridge 'WebOTX.Bridgeオブジェクトの生成 '子の構造体の作成 Set account = Bridge.CreateType("sample_sampleNestStruct::auth") account.id = 123456 account.password = "himitsu" '親の構造体の作成 Set person = Bridge.CreateType("sample_sampleNestStruct::person") person.married = False person.name = "日電花子" Set person.account = account '親に子を設定 'サーバメソッド呼出し Set SvrObj = CreateObject("WebOTX.sample_sampleNestStruct") Call SvrObj.entry(person) |
出力パラメータに構造体中の構造体を使用する場合は、パラメータとしてObject型変数を指定します。初期化する必要はありません。
また、サーバメソッドを呼び出した後、子の構造体のデータを取り出すには、オブジェクト変数に子のオブジェクトを指定します。次に例を示します。
[VB6.0, VB.NET]
'(VB.NETの場合、Setステートメントは不要) Dim SvrObj As Object 'サーバオブジェクト Dim account AS Object '子の構造体 Dim person As Object '親の構造体 Dim id As Integer Dim password As String 'サーバメソッド呼出し Set SvrObj = CreateObject("WebOTX.sample_sampleNestStruct") Call SvrObj.search(True, person) '構造体中の構造体の取得 Set account = person.account '親から子を取得 id = account.id password = account.password |
VB.NETでは、Setステートメントが不要のため、オブジェクトの代入処理に次のような違いがあります。
[VB6.0]
Dim SvrObj As Object
'サーバオブジェクトの生成
Set SvrObj = CreateObject("WebOTX.Sample")
[VB.NET]
Dim SvrObj As Object
'サーバオブジェクトの生成
SvrObj = CreateObject("WebOTX.Sample")
|
VB.NETにおけるNothing代入によるオブジェクトの解放は .NET Frameworkのガベージコレクトの発生まで遅延するため、即時にオブジェクトが解放されません。これによりクライアントリソースが減少するだけでなく、クライアントとアプリケーションサーバ間のコネクション持続時間が長くなり、アプリケーションサーバに同時に接続できるクライアントアプリケーション数が減少することがあります。
このため、VB.NETでオブジェクトを即時に解放する場合は System
または、ReleaseComObject()
により明示的にオブジェクトを解放するか、System
によりガベージ コレクションを実行してください。
[VB 2005以降: 明示的に解放]
Imports System.Runtime.InteropServices.Marshal
:
'各オブジェクトを明示的に解放
If Not Person Is Nothing Then
FinalReleaseComObject(Person)
Person = Nothing
End If
If Not SvrObj Is Nothing Then
FinalReleaseComObject(SvrObj)
SvrObj = Nothing
End If
[VB.NET 2003以前: 明示的に解放]
Imports System.Runtime.InteropServices.Marshal
:
'各オブジェクトを明示的に解放
If Not Person Is Nothing Then
Do While ReleaseComObject(Person) > 0
Loop
Person = Nothing
End If
If Not SvrObj Is Nothing Then
Do While ReleaseComObject(SvrObj) > 0
Loop
SvrObj = Nothing
End If
[VB.NET: GCにより解放]
'各オブジェクトをGCにより解放 Person = Nothing SvrObj = Nothing 'ガベージ コレクション実行 GC.Collect() |
マルチスレッドプログラムから同時アクセスする場合、スレッド開始前にスレッドモデルをSTA(シングルスレッドアパートメント)に設定する必要があります。特に、.NET Framework 2.0以降(Visual Basic 2005以降)の場合、スレッドモデルの既定値は MTA(マルチスレッドアパートメント)であるため、Thread.SetApartmentState
メソッドにより、STAに設定する必要があります。マルチスレッド および、スレッドモデルの詳細については、マイクロソフトの技術資料(MSDNなど)を参照してください。
[VB 2005以降]
Imports System.Threading : 'スレッドを準備 Dim th As New Thread(AddressOf ThreadProc) 'スレッドモデルをSTAに設定 th.SetApartmentState(ApartmentState.STA) 'スレッド開始 th.Start() : 'スレッドの実行開始メソッド Sub ThreadProc() 'スレッドのApartmentStateを表示 MsgBox("ApartmentState(0:STA, 1:MTA, 2:Unknown)=" & _ Thread.CurrentThread.GetApartmentState()) End Sub [VB.NET 2003以前]
Imports System.Threading : 'スレッドを準備 Dim th As New Thread(AddressOf ThreadProc) 'スレッドモデルをSTAに設定 th.ApartmentState = ApartmentState.STA 'スレッド開始 th.Start() : 'スレッドの実行開始メソッド Sub ThreadProc() 'スレッドのApartmentStateを表示 MsgBox("ApartmentState(0:STA, 1:MTA, 2:Unknown)=" & _ Thread.CurrentThread.ApartmentState) End Sub |
IFコンパイラ (woifgenコマンド) の使用方法を説明します。
形 式 | woifgen { /ta | /ts | /u | /c } [IFファイル名] [/s] [/r 継承元IFファイル名] |
---|---|
機 能 | CORBAゲートウェイ, EJBゲートウェイ用制御ファイルの生成、登録、削除 |
オプション |
/ta(省略可) IFファイル名
IFファイルから制御ファイルを生成し、Visual Basic用 および、ASP用としてレジストリに登録します。
/ts IFファイル名
IFファイルから制御ファイルを生成し、シングルスレッド用としてレジストリに登録します。VB6.0以外では使用しないでください。
/u IFファイル名
IFファイルに関する登録済みの情報をレジストリから削除します。
/c
レジストリを全て検索し、制御ファイルがないなどの整合性のとれていない登録済みの情報をレジストリから削除します。削除したレジストリ情報は
wo{yymmdd}.reg ファイルにバックアップします。
/s
コマンド実行時に、メッセージボックスの表示を抑制します。
/r 継承元IFファイル名
利用するインタフェースが継承されている場合、継承元に相当するIFファイルを指定します。
|
終了コード | 終了コードはバッチプログラム内で環境変数 woifgen.log にスタックトレースが出力されます。
|
wo{yymmdd}.reg
は同名のファイルが存在する場合、後ろに追加します。yymmdd
は西暦の年月日を示します。障害が発生した場合は、調査のためトレースファイルを採取してください。
クライアントアプリケーション実行時に障害が発生した場合、CORBAゲートウェイと Object Broker C++のトレースが必要になります。
IFコンパイル実行時に障害が発生した場合、IFコンパイラのトレースが必要になります。
CORBAゲートウェイのデバッグトレースを採取するには、次のレジストリ内容を適用してください(キーや値がない場合は作成してください)。
レジストリキー | HKEY_LOCAL_MACHINE\Software\NEC\WebOTX\ClientBridge | |
---|---|---|
名 前 | 種 類 | 値(既定値) |
TraceLevel | DWORD (REG_DWORD) |
7 (既定値: 5) |
VBアプリケーションの場合、トレースファイルは作業フォルダ(カレントディレクトリ)内のorbclbrg.log
に出力されます。ASPアプリケーションの場合、トレースファイルはシステム環境変数
Memo エラー内容の詳細については、 [例外 > CORBA > CORBA, EJBゲートウェイのエラー一覧] を参照してください。
ファイルサイズの上限やファイル名を変更する場合は、次のレジストリ内容を適用してください(キーや値がない場合は作成してください)。
レジストリキー | HKEY_LOCAL_MACHINE\Software\NEC\WebOTX\ClientBridge | |
---|---|---|
名 前 | 種 類 | 値(既定値) |
TraceFilename | 文字列 (REG_SZ) |
取得するトレースファイル名orbclbrg.log )255文字以内の文字列を設定します。 出力先の既定値は、VBアプリケーションは作業フォルダ(カレントディレクトリ)で、ASPアプリケーションはシステム環境変数 出力先を変更するには、ファイル名をフルパスで指定してください。 |
TraceSize | DWORD (REG_DWORD) |
トレースサイズの上限 トレースサイズの上限をKバイト単位で設定します。この上限を超えると、ファイル名の末尾に「 .bak 」を付加してバックアップし、新しいトレースファイルを作成します。 |
TraceMulti | DWORD (REG_DWORD) |
プロセス別にトレースファイルを分割する
|
ユーザプログラムの マニフェストの有無 |
ユーザプログラムの 作業フォルダ権限 |
ログファイルの |
---|---|---|
マニフェスト あり | マニフェスト内の実行権限による書き込み権限 あり | ユーザプログラムの作業フォルダ (推奨する運用)。 |
マニフェスト内の実行権限による書き込み権限 なし | 環境変数 |
|
マニフェスト なし | Users権限の書き込み権限 あり | ユーザプログラムの作業フォルダ (推奨する運用)。 |
Users権限の書き込み権限 なし | 作業フォルダが環境変数 それ以外の場合は、環境変数 |
通信に関する詳細な調査の際は、Object Broker C++のトレースログが必要になります。 Object Broker C++の詳細トレースを採取するには、次のレジストリ内容を適用してください(値がない場合は作成してください)。
レジストリキー | HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectBroker\<バージョン識別子> | |
---|---|---|
名 前 | 種 類 | 値(既定値) |
LoggingLevel | 文字列 (REG_SZ) |
INFORMATION (既定値: ERROR) |
MessagingLog | 文字列 (REG_SZ) |
on (既定値: off) |
MessageBodyLog | 文字列 (REG_SZ) |
on (既定値: off) |
出力されるトレースファイル名は
配下のmessage.log
とObLog.log
になります。
ファイルサイズの上限やファイル名を変更する場合は、次のレジストリ内容を適用してください(値がない場合は作成してください)。
レジストリキー | HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectBroker\<バージョン識別子> | |
---|---|---|
名 前 | 種 類 | 値(既定値) |
LogLimit | 文字列 (REG_SZ) |
ログファイルサイズの上限(既定値: 10240Kバイト, 値がない場合は無制限) ファイルサイズの上限をKバイト単位で設定します。この上限を超えると、ファイル名の末尾に「 _old 」を付加してバックアップし、新しいログファイルを作成します。 |
LoggingOutput | 文字列 (REG_SZ) |
ロギングファイル名(既定値: 配下のObLog.log ) |
MessageLogFile | 文字列 (REG_SZ) |
通信ログファイル名(既定値: 配下のmessage.log ) |
IFコンパイラはIFコンパイル時にランタイムエラーなどの例外が発生した場合、作業フォルダ(カレントディレクトリ)内にwoifgen.log
を出力します。