2. CORBAゲートウェイ

2.1. CORBAゲートウェイの概要

WebOTXはVisual Basicで開発したクライアントアプリケーションから、CORBAサーバアプリケーションの通信を実現するCORBAゲートウェイを提供しています。本節では、CORBAゲートウェイを利用したアプリケーションの開発方法について説明します。

Caution
CORBAゲートウェイは、64bit OSではWOW64上で動作します。
64bit OSでご利用になる場合は以下の注意点があります。

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-ORB Protocol)を使用します。
名前サーバのホスト名はorbcustmの[詳細設定]ダイアログで設定します。 orbcustmについては、[リファレンス集 運用管理・設定編 > 4. 運用管理コマンドリファレンス > 4.9. Object Broker]を参照してください。

2.2. CORBAゲートウェイの提供機能

CORBAゲートウェイの提供機能は次の通りです。

以下に使用可能なデータ型について説明します。

2.2.1. 使用可能なデータ型

CORBAゲートウェイで使用可能なデータ型のマッピングは次の通りです。

IDL型 VB6.0型 VB.NET型 .NET System型 Java型 C++型 in, out, inout, 戻り値 sequence, 配列注1,2
void 省略 省略 System.Void void void
octet Byte Byte System.Byte byte CORBA::Octet
short Integer Short System.Int16 short CORBA::Short
unsigned short Integer UShort注3 System.UInt16 short注4 CORBA::UShort 注5
long Long Integer System.Int32 int CORBA::Long
unsigned long Long UInteger注3 System.UInt32 int注4 CORBA::ULong 注5
long long Long System.Int64 long CORBA::LongLong
unsigned long long ULong注3 System.UInt64 long注4 CORBA::ULongLong
float Single Single System.Single float CORBA::Float
double Double Double System.Double double CORBA::Double
boolean Boolean Boolean System.Boolean boolean CORBA::Boolean
char注6,7 Byte Byte System.Byte char CORBA::Char
string注7 String String System.String String char*
wchar注8 Integer UShort注3 System.UInt16 char CORBA::WChar 注5
wstring注8 String String System.String String CORBA::WChar*
struct注9 Object Object System.Object class class
enum注10 Long UInteger注3 System.UInt32 class enum
Object注11 Object Object System.Object CORBA.Object CORBA::Object 戻り値のみ ×
any, union × × × ×

Caution
注1
sequenceと配列を使用する場合、添え字の下限は 0になります。
sequenceを使用する場合は、Dim Var() As xxxxx で宣言します。
詳細は[配列の使用方法]を参照してください。
注2
typedefはsequenceと配列のみで使用できます。また、typedefで定義した型をさらにtypedefした型は使用できません。
詳細は[配列の使用方法]を参照してください。
注3
VB 2005からサポートされた型です。VB.NET 2003以前の環境で使用する場合は .NET FrameworkのSystem型を使用してください。
注4
javaには符号なしの型がないため、符号付きで同一バイトイメージの値にマッピングされます。
注5
VB6.0の場合、型の符号違いにより配列は使用できません。
注6
文字として有効な値のみ使用できます。文字に該当しない値を使用する場合は octetを使用してください。
注7
サーバアプリケーションがC++言語の場合に使用します。Java言語の場合、文字はwcharを、文字列はwstringを使用してください。
注8
サーバアプリケーションがJava言語の場合に使用します。C++言語の場合、文字はcharを、文字列はstringを使用してください。
注9
structを生成するには、オブジェクトライブラリAPIのCreateTypeメソッドを使用します。詳細は[構造体の使用方法]を参照してください。
注10
enumを使用する場合、最初の項目を0として順に番号が割り当てられます。
注11
VB6.0でObject型を取得するには、通常のオブジェクトと同様にSetステートメントを使用します。
例) Set Obj = インタフェース名.オペレーション

2.3. 環境構築と環境設定

開発環境と実行環境の環境構築 および、動作環境の設定について説明します。

開発環境の構築

開発環境に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アプリケーションはシステム環境変数 %TEMP%が示すフォルダです。
出力先を変更するには、ファイル名をフルパスで指定してください。
TraceLevel DWORD
(REG_DWORD)
トレースのレベル(既定値: 5)
1
即時に訂正すべき状態
2
致命的なエラー
3
一般的なエラー
4
警告メッセージ
5
通知メッセージ
6
情報メッセージ(運行履歴用)
7
デバッグメッセージ(障害解析時)
障害時には7を設定した状態のトレースを採取してください。
TraceSize DWORD
(REG_DWORD)
トレースサイズの上限(既定値: 64Kバイト)
トレースサイズの上限をKバイト単位で設定します。この上限を超えると、ファイル名の末尾に「.bak」を付加してバックアップし、新しいトレースファイルを作成します。
TraceMulti DWORD
(REG_DWORD)
プロセス別にトレースファイルを分割する
0
トレースファイルを分割しない(既定値)
1
トレースファイル名にプロセス番号を付加して、プロセス毎にトレースファイルを作成する
ASPアプリケーションの場合は、1が既定値です。
MaxObject DWORD
(REG_DWORD)
オブジェクト数の上限(既定値: 2048個)
システムに過剰な負荷を与えるのを防止するため、オブジェクト数には上限値が設定されています。 既定値から拡張する場合、2049〜65535の範囲で設定します。 上限を超えると、エラー A1028108が発生します。
Factory DWORD
(REG_DWORD)
オブジェクト作成時にファクトリを使用する
0
ファクトリを使用しない
1
ファクトリが有効の場合は使用する(既定値)
NameServiceGroup 文字列
(REG_SZ)
名前サービス登録グループ名(既定値: WO_Default)
511文字以内の文字列を設定します。
名前サーバ登録名の既定値に含まれる "WO_Default"の部分がグループ名に相当します。複数のサーバで構成されるシステムの場合、このグループ名を変更して登録することにより、任意のサーバをグルーピングすることができます。このグループ名を設定することにより、アクセスするサーバを選択することができます。
CacheFlag DWORD
(REG_DWORD)
オブジェクトキャッシュ機能を使用する
0
オブジェクトキャッシュを使用しない
1
オブジェクトキャッシュを使用する(既定値)
ASPアプリケーションの場合は、0が既定値です。
NameServiceHostList 文字列
(REG_SZ)
名前サーバのホスト名(既定値: なし)
511文字以内の文字列を設定します。
キャシュ名前サービスなどで複数の名前サービスを利用する場合、カンマ「,」区切りで複数ホスト名を記述します。
AliveCheck DWORD
(REG_DWORD)
アライブチェックを行う
0
アライブチェックを行わない(既定値)
1
アライブチェックを行う
サーバ・クライアント共に有効にした場合にのみ、アライブチェックが有効となります。
AsyncMessage DWORD
(REG_DWORD)
非同期メッセージ機能を使用する
0
非同期メッセージ機能を使用しない(既定値)
1
非同期メッセージ機能を使用する
ASPアプリケーションの場合、この設定は無効です。

ネットワーク環境の設定

CORBAゲートウェイの通信に必要なネットワーク設定について説明します。

ポート番号/プロトコル ファイル名 機能名
80/TCP
(既定値)
Webサーバのファイル名を指定します。 IISの場合、登録済みの名前から「Web サーバー」または、「World Wide Web サービス」を選択します。 IIS以外の場合はWebサーバのマニュアルを参照して、該当するファイル名を確認してください。 Webサーバ
9825/TCP
(既定値)
<インストールディレクトリ>\ObjectBroker\bin\oad.exe oad
2809/TCP
(既定値)
<インストールディレクトリ>\ObjectBroker\bin\namesv.exe 名前サーバ
5151/TCP
(既定値)
<インストールディレクトリ>\Trnsv\bin\iioplsn.exe IIOPリスナ

最大待ち時間(タイムアウト)を変更する場合

クライアントからサーバに発行したメソッド等のリクエストは既定で30秒の最大待ち時間(タイムアウト)があり、この時間に応答がない場合は、エラー A1028117が発生します。

最大待ち時間を既定値の30秒から変更する場合、クライアントのレジストリに Object BrokerのRequestTimeoutを適用してください(値がない場合は作成してください)。 または、APIのSetTimeoutで設定してください。APIの設定はObject BrokerのRequestTimeoutより優先します。

レジストリキー HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectSpinner\1
名 前 種 類 値(既定値)
RequestTimeout 文字列
(REG_SZ)
メソッド呼び出しのタイムアウト(既定値: 30秒)
タイムアウト時間を秒単位で設定します。
処理が戻るまで待つ場合は0を設定します。
高負荷時を考慮して10秒以下は設定しないでください。

受信データが8Mバイトを超える場合

受信データが8M(8,388,608)バイトを超える場合、クライアントのレジストリに Object BrokerのMaxMessageSizeを適用してください(値がない場合は作成してください)。

ただし、サーバ側の送受信上限値 99,999,998(約100M)バイトを超えるデータを受信することはできません。 詳細については、[高度な管理と運用サイクルガイド > 2. チューニング > 2.1.4.9. 電文長の長いメッセージの送受信]を参照してください。

レジストリキー HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectSpinner\1
名 前 種 類 値(既定値)
MaxMessageSize 文字列
(REG_SZ)
受信データの上限(既定値: 8388608バイト)
既定値から拡張する場合、バイト単位で 8388609〜99999998の範囲を指定します。

WebOTX Ver5.3以前のサーバと通信する場合

WebOTX Ver6.1から Object BrokerのAddWstringWidthOctetプロパティの既定値が trueから falseに変更されました。このため、IDL内に wstringを含み、WebOTX Ver6.2以降のクライアントからVer5.3以前のサーバに接続する場合、クライアントのAddWstringWidthOctetプロパティの値をtrueに設定してください。

クライアントのAddWstringWidthOctetプロパティを設定するには、次のレジストリ内容をクライアントに適用してください(値がない場合は作成してください)。

レジストリキー HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectSpinner\1
名 前 種 類 値(既定値)
AddWstringWidthOctet 文字列
(REG_SZ)
true (既定値: false)

2.4. 制御ファイルの登録

CORBAゲートウェイを用いたVisual Basicアプリケーションの開発には、事前準備としてIFファイルを使用してCORBAゲートウェイの制御ファイル(GC1, TLB)を生成する必要があります。 IFファイルとはIDLコンパイラが生成するファイルです。

CORBAゲートウェイを用いたVisual Basicアプリケーションの開発には、事前準備として次のような手順が必要になります。

  1. IDLファイルの作成
  2. IDLコンパイラによるIFファイルの生成
  3. CORBAサーバアプリケーションの作成
  4. 制御ファイル(GC1, TLB)の生成と登録

1〜3.の手順については、[1. CORBAアプリケーション > 1.2.1. WebOTX AS CORBAアプリケーション]を参照してください。 作成したCORBAサーバアプリケーションを配備する方法については、[ドメイン構築・基本設定ガイド > 5. アプリケーション > 5.4. 配備、再配備と置換]を参照してください。

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の影響を受けることがあります。詳しくは、[コマンドリファレンス]の注意事項を参照してください。

2.5. クライアントAPIの使用方法

CORBAゲートウェイのAPIを利用するには WebOTX.Bridgeオブジェクトを使用する必要があります。 WebOTX.Bridgeオブジェクトを生成するには次の2つの方法があります。

  1. Newメソッドを使用する方法
  2. CreateObject関数を使用する方法

1.はVisual Basicで使用できます。2.はVisual Basic および、ASPで使用できます。

Memo クライアントAPIの詳細(リファレンス)については、[リファレンス集 開発編(共通) > 4. CORBA > 4.7. CORBA, EJBゲートウェイ]を参照してください。

Newメソッドを使用する方法

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関数を使用する方法

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メソッドを使用する事前(アーリー)バインディングと異なり、コーディング時の入力支援機能は利用できません。

2.6. プログラミング・開発ガイド

CORBAゲートウェイを用いたVisual Basicアプリケーションの開発について説明します。
処理毎に以下の項目に分けて説明します。

クライアント側のサンプルソースは、マニュアルのサンプルをインストールしたディレクトリ配下のsamples\corba\corbagw.zipに格納されています。

以下に各項目について説明します。

2.6.1. 基本的な使用方法

クライアントアプリケーションは通常のVisual Basicアプリケーションと同じように作成します。クライアントアプリケーションは、サーバオブジェクトに対応したCOMオブジェクトを使用することにより、アプリケーションサーバ上のサーバオブジェクトを利用することができます。

CORBAゲートウェイの基本的な使用方法として、サーバオブジェクトの作成から解放までに必要な処理は次のようになります。

  1. Object型の変数を宣言
  2. サーバオブジェクトを生成
  3. サーバオブジェクトメソッドの呼び出し
  4. エラー処理
  5. サーバオブジェクトの解放

以下に各処理手続きについて説明します。

  1. Object型の変数を宣言
    Visual BasicでObject型の変数を宣言します。
    [VB6.0, VB.NET]
    Dim SvrObj As Object            'サーバオブジェクト
    
  2. サーバオブジェクトを生成
    サーバオブジェクトを生成するには、次のようにCreateObjectを使用します。
    [VB6.0, VB.NET]
    '(VB.NETの場合、Setステートメントは不要)
    'サーバオブジェクトの生成
    Set SvrObj = CreateObject("WebOTX.sample_LoopBackSample")
    
    指定するサーバオブジェクト名には IDLの module名と interface名が反映され、次のような命名規則になります。
    WebOTX.module名_module名_…_interface名
  3. サーバオブジェクトメソッドの呼び出し
    サーバオブジェクトのメソッドを呼び出すには、次のように通常のオブジェクトと同様にそのままメソッド名を使用します。
    メソッドの引数や戻り値で使用できる型とIDLからVisual Basicへのマッピングについては、[使用可能なデータ型]を参照してください。
    [VB6.0, VB.NET]
    'サーバメソッドの呼び出し
    retval = SvrObj.LoopBack(inData, outData)
    
  4. エラー処理
    CORBAゲートウェイは実行時エラーが発生した場合にエラーメッセージと共にエラー番号を返却します。VB6.0の場合は、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 エラー内容の詳細については、[例外一覧 > 5. CORBA > 5.4. CORBA, EJBゲートウェイのエラー一覧]を参照してください。

  5. 各オブジェクトの解放
    各オブジェクトが不要になった際は、Object型の変数に Nothingを代入してオブジェクトを解放します。
    VB.NETにおけるオブジェクトの解放は .NET Frameworkのガベージコレクトの発生まで遅延するため、即時にオブジェクトが解放されません。このため、VB.NETでオブジェクトを即時に解放する場合は 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

2.6.2. 配列の使用方法

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を添え字とする

入出力パラメータ、出力パラメータ および、返却値に対する各要素の取り扱いは、可変長配列を使用した場合と同様に処理することができます。

2.6.3. 多次元配列の使用方法

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を添え字とする

入出力パラメータ、出力パラメータ および、返却値に対する各要素の取り扱いは、可変長多次元配列を使用した場合と同様に処理することができます。

2.6.4. 構造体の使用方法

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オブジェクトに初期化されます。構造体の名前には次のような命名規則があります。

  • インタフェース定義の内部でsturct宣言した場合
    module名_module名_…_interface名::struct名
  • インタフェース定義の外部でstruct宣言した場合
    module名_…_module名::struct名

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                  '要素の取得

2.6.5. 構造体の配列の使用方法

構造体を配列で使用するには、構造体以外を配列で使用する場合と比べて、実装方法が異なります。次に例を示します。

[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.6.6. 構造体の多次元配列の使用方法

構造体を多次元配列で使用するには、構造体以外を多次元配列で使用する場合と比べて、実装方法が異なります。次に、構造体の可変長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を添え字とする

入力パラメータ、入出力パラメータ および、出力パラメータに対する各要素の取り扱いは、可変長多次元配列を使用した場合と同様に処理することができます。

2.6.7. 構造体を含む構造体の使用方法

構造体の要素中に構造体を使用する場合について説明します。次に例を示します。

[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

2.7. Visual Basic .NETにおける注意点

オブジェクト代入処理の違い

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.Runtime.InteropServices.Marshal.FinalReleaseComObject()または、ReleaseComObject()により明示的にオブジェクトを解放するか、System.GC.Collect()によりガベージ コレクションを実行してください。

[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

2.8. コマンドリファレンス

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ファイルを指定します。
終了コード 終了コードはバッチプログラム内で環境変数 %ERRORLEVEL%により確認できます。 終了コードが200番台の場合、woifgen.logにスタックトレースが出力されます。
4
レジストリ登録失敗。
100
正常終了。
101
指定された入力ファイルが存在しません。
102
指定されたIDLに使用できない型が定義されています。
103
GC1ファイルかTLBファイルが使用中のためアクセスできません。
104
GC1ファイルかTLBファイルを生成できません。
105
指定された入力ファイルが不正な形式です。
106
IDLで定義された継承元定義がありません。
200
WOFileExceptionが発生しました。woifgen.logを採取してください。
201
WOMemoryExceptionが発生しました。woifgen.logを採取してください。
202
WORangeExceptionが発生しました。woifgen.logを採取してください。
203
WOInvalidPathExceptionが発生しました。woifgen.logを採取してください。
204
WOExceptionが発生しました。woifgen.logを採取してください。
205
CExceptionが発生しました。woifgen.logを採取してください。

Caution

2.9. 障害時のトレース取得方法

障害が発生した場合は、調査のためトレースファイルを採取してください。

クライアントアプリケーション実行時に障害が発生した場合、CORBAゲートウェイと Object Broker C++のトレースが必要になります。

IFコンパイル実行時に障害が発生した場合、IFコンパイラのトレースが必要になります。

CORBAゲートウェイのトレース

CORBAゲートウェイのデバッグトレースを採取するには、次のレジストリ内容を適用してください(キーや値がない場合は作成してください)。

レジストリキー HKEY_LOCAL_MACHINE\Software\NEC\WebOTX\ClientBridge
名 前 種 類 値(既定値)
TraceLevel DWORD
(REG_DWORD)
7 (既定値: 5)

VBアプリケーションの場合、トレースファイルは作業フォルダ(カレントディレクトリ)内のorbclbrg.logに出力されます。ASPアプリケーションの場合、トレースファイルはシステム環境変数 %TEMP%が示すフォルダに出力されます。

Memo エラー内容の詳細については、[例外一覧 > 5. CORBA > 5.4. CORBA, EJBゲートウェイのエラー一覧]を参照してください。

ファイルサイズの上限やファイル名を変更する場合は、次のレジストリ内容を適用してください(キーや値がない場合は作成してください)。

レジストリキー HKEY_LOCAL_MACHINE\Software\NEC\WebOTX\ClientBridge
名 前 種 類 値(既定値)
TraceFilename 文字列
(REG_SZ)
取得するトレースファイル名(既定値: orbclbrg.log
255文字以内の文字列を設定します。
出力先の既定値は、VBアプリケーションは作業フォルダ(カレントディレクトリ)で、ASPアプリケーションはシステム環境変数 %TEMP%が示すフォルダです。
出力先を変更するには、ファイル名をフルパスで指定してください。
TraceSize DWORD
(REG_DWORD)
トレースサイズの上限(既定値: 64Kバイト)
トレースサイズの上限をKバイト単位で設定します。この上限を超えると、ファイル名の末尾に「.bak」を付加してバックアップし、新しいトレースファイルを作成します。
TraceMulti DWORD
(REG_DWORD)
プロセス別にトレースファイルを分割する
0
トレースファイルを分割しない(既定値)
1
トレースファイル名にプロセス番号を付加して、プロセス毎にトレースファイルを作成する
ASPアプリケーションの場合は、1が既定値です。

Caution
Windows Vista以降でUAC(ユーザアカウント制御)が有効の場合、ログファイルの出力先はユーザプログラムのマニフェストファイルやフォルダの権限により、次のように異なります。
ユーザプログラムの
マニフェストの有無
ユーザプログラムの
作業フォルダ権限
ログファイルの出力先
マニフェスト あり マニフェスト内の実行権限による書き込み権限 あり ユーザプログラムの作業フォルダ
(推奨する運用)。
マニフェスト内の実行権限による書き込み権限 なし 環境変数 %TEMP%が示すフォルダ。
マニフェスト なし Users権限の書き込み権限 あり ユーザプログラムの作業フォルダ
(推奨する運用)。
Users権限の書き込み権限 なし 作業フォルダが環境変数 %ProgramFiles% あるいは、%WinDir%が示すフォルダ配下の場合は、仮想ストア(%LocalAppData%\VirtualStore)の該当するフォルダ。
それ以外の場合は、環境変数 %TEMP%が示すフォルダ。

Object Broker C++のトレース

通信に関する詳細な調査の際は、Object Broker C++のトレースログが必要になります。 Object Broker C++の詳細トレースを採取するには、次のレジストリ内容を適用してください(値がない場合は作成してください)。

レジストリキー HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectSpinner\1
名 前 種 類 値(既定値)
LoggingLevel 文字列
(REG_SZ)
INFORMATION (既定値: ERROR)
MessagingLog 文字列
(REG_SZ)
on (既定値: off)
MessageBodyLog 文字列
(REG_SZ)
on (既定値: off)

出力されるトレースファイル名は <インストールディレクトリ>\ObjectBroker\log配下のmessage.logObLog.logになります。

ファイルサイズの上限やファイル名を変更する場合は、次のレジストリ内容を適用してください(値がない場合は作成してください)。

レジストリキー HKEY_LOCAL_MACHINE\SOFTWARE\NEC\ObjectSpinner\1
名 前 種 類 値(既定値)
LogLimit 文字列
(REG_SZ)
ログファイルサイズの上限(既定値: 10240Kバイト, 値がない場合は無制限)
ファイルサイズの上限をKバイト単位で設定します。この上限を超えると、ファイル名の末尾に「_old」を付加してバックアップし、新しいログファイルを作成します。
LoggingOutput 文字列
(REG_SZ)
ロギングファイル名(既定値: <インストールディレクトリ>\ObjectBroker\log配下のObLog.log
MessageLogFile 文字列
(REG_SZ)
通信ログファイル名(既定値: <インストールディレクトリ>\ObjectBroker\log配下のmessage.log

IFコンパイラのトレース

IFコンパイラはIFコンパイル時にランタイムエラーなどの例外が発生した場合、作業フォルダ(カレントディレクトリ)内にwoifgen.logを出力します。