分散アプリケーションサーバ TP1/LiNK 使用の手引
UAPをコンパイルし,リンケージするために,Microsoft Visual C++のツールのnmakeコマンドを使います。ここでは,nmakeコマンドとともに使用できるmakefileの例を,作成する言語ごとに説明します。詳細については,各言語のマニュアルを参照してください。なお,サービス関数動的ローディング機能を使用してUAPを作成する場合は,「(5) サービス関数動的ローディング機能を使用する場合」を参照してください。
C言語で作成したUAPのソースプログラム名
# TP1TEST Make File NODEBUG=1 !include <ntwin32.mak> SYSLIB = msvcrt.lib $(conlibsdll) TP1LIB = betran.lib RMLIB = RM.lib all:TP1TEST.exe #コンパイル exmain.obj:exmain.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv1.obj:exsv1.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv2.obj:exsv2.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c ex_sstb.obj:ex_sstb.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c #スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? # リンケージ TP1TEST.exe: exmain.obj exsv1.obj exsv2.obj ex_sstb.obj $(link) /NODEFAULTLIB $(conflags) $(linkdebug) /out:$*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \] [$(RMLIB)] $(TP1LIB) $(SYSLIB)
Visual Studioで作成したプログラムを動作させる場合,マニフェストファイルが必要です。マニフェストファイルをメイクファイルに埋め込まない場合,プログラムを実行するフォルダにマニフェストファイルをコピーする必要があります。
なお,Visual Studio 2010またはVisual Studio 2012を使用してプログラムを作成している場合,マニフェストが作成されないことがあります。この場合は,マニフェストファイルは必須ではありません。
# TP1TEST Make File NODEBUG=1 !include <ntwin32.mak> SYSLIB = msvcrt.lib $(conlibsdll) TP1LIB = betran.lib RMLIB = RM.lib all:TP1TEST.exe #コンパイル exmain.obj:exmain.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv1.obj:exsv1.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv2.obj:exsv2.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c ex_sstb.obj:ex_sstb.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c #スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? # リンケージ TP1TEST.exe: exmain.obj exsv1.obj exsv2.obj ex_sstb.obj $(link) /NODEFAULTLIB $(conflags) $(linkdebug) /out:$*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \] [$(RMLIB)] $(TP1LIB) $(SYSLIB) mt -manifest $@.manifest -outputresource:$@;1
Visual Studioで作成したアプリケーションをVisual Studioをインストールしていない環境で動作させる場合,Visual C++アプリケーションの実行に必要なMicrosoft Visual C++再頒布可能パッケージ(x86)をインストールする必要があります。詳細は,各Visual Studioのドキュメントを参照してください。
# TP1TEST Make File NODEBUG=1 !include <ntwin32.mak> CBLFG1 = -Compile,NoLink -Lib,CUI -Comp5 -Main,System CBLFG2 = -Compile,NoLink -Lib,CUI -Comp5 TP1LIB = betran.lib RMLIB = RM.lib CCBL = ccbl2002 all:TP1TEST.exe # コンパイル main.obj:main.cbl $(CCBL) $(CBLFG1) main.cbl sev1.obj:sev1.cbl $(CCBL) $(CBLFG2) sev1.cbl sev2.obj:sev2.cbl $(CCBL) $(CBLFG2) sev2.cbl ex_sstb.obj:ex_sstb.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c # スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? # リンケージ TP1TEST.exe: main.obj sev1.obj sev2.obj ex_sstb.obj $(CCBL) -Lib,CUI -OutputFile $*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \] [$(RMLIB)] $(TP1LIB)
プロジェクト作成時に指定するプロジェクトの種類は,Win32プロジェクトを指定してください。
「-Lib:CUI用の実行時ライブラリを使用する」を設定してください。
「ライブラリの指定」として,次に示す内容を指定してください。
リンケージオプションとして,次に示す内容を追加してください。
dc_rpc_mainloop関数を含むメインプログラムを作成します。作成例については,製品に付属されているサンプルソース(メイクファイル)を参照してください。
UAP共用ライブラリ中には,複数のサービス関数を含めることができます。UAP共用ライブラリに含まれる関数の中で,[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定するサービス関数については,必ずUAP共用ライブラリからエクスポートしてください。エクスポートされていないサービス関数がUAP共用ライブラリに存在していた場合,ユーザサーバ起動時(非常駐サーバの場合はプロセス起動時)にKFCA00344-Eメッセージが出力されて,dc_rpc_mainloop関数のDCRPCER_FATAL(-303)でエラーリターンします。[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定するサービス関数以外の関数についてのエクスポートは必須ではありませんので,処理形態に応じてエクスポートしてください。
UAP共用ライブラリから関数をエクスポートするには,LIBコマンドまたはLINKコマンドを使用する方法があります。次に示すどれかの方法でサービス関数をエクスポートしてください。
サービス関数の作成例については,製品に付属されているサンプルソース(メイクファイル)を参照してください。
[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定したUAP共用ライブラリ内でTLS(スレッドローカルストレージ)を使用した変数宣言をしないようにしてください。次のように,コーディングを含むUAPオブジェクトが,UAP共用ライブラリ内に存在する場合,該当の変数を参照するときにアクセス例外が発生します。
__declspec(Thread) int sample;
次に示す場合はサービス関数動的ローディング機能を使用できません。
All Rights Reserved. Copyright (C) 2006, 2013, Hitachi, Ltd.