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;
次に示す場合はサービス関数動的ローディング機能を使用できません。