【2019 R3】ファイルコピーによるランタイムの配布とアプリケーションの実行

どのランタイムが必要なの?

こんにちは。エイタです!

Yama-chan も話題にしてくれたランタイムパッケージャ、便利ですよね。 でも、場合によっては実行端末への「インストール」を避けたいケースもあるかと思います。 そんな時は、PowerBuilder をインストールした端末からランタイムファイルを実行環境へコピーすることでも EXE を実行することができるんですが・・・、ランタイムパッケージャを使用しない場合は、マニュアルを参照して必要なランタイムをひとつひとつ自分で選定する必要がありますよね。

めんどくさい。

苦労してランタイムファイルを選び出して、いざ実行してみたら起動しなかった・・・といった経験がある方も多いかと思います (私も頻繁にあります)。 そんな面倒な作業で苦労しているみなさんの助けになればと思い、また個人的な備忘録として、PowerBuilder アプリケーションのランタイムファイルについてもうちょっと踏み込んで解説します。


ランタイムの種類

まずはおおざっぱにランタイムをカテゴライズしてみましょう。 マニュアルの記載を参考に (1) コアランタイム(2) Microsoft ファイル(3) 機能ごとのランタイム、そして (4) DB インターフェイスのランタイムの 4 つに分けてみました。

PowerBuilder 2019 R3 では、これから紹介するファイルは PowerBuilder をインストールした際に作成される “Appeon\Common\PowerBuilder” フォルダーに、各バージョン (ビルド) 番号ごとに格納されています。 また、64-bit アプリケーションを配布する場合は、ビルド番号ごとのフォルダー内の “x64” フォルダーからコピーします。

PowerBuilder をデフォルト設定でインストールした場合は下記のフォルダーです。

32-bit 用

C:\Program Files (x86)\Appeon\Common\PowerBuilder\Runtime [バージョン番号]

64-bit 用

C:\Program Files (x86)\Appeon\Common\PowerBuilder\Runtime [バージョン番号]\x64

ちなみに PB ランタイムファイルについては、これまでのバージョンと比べてファイル名にはバージョンが付加されていないことと、必要なランタイムが増えていることに注意してください。

それでは、それぞれのランタイムについて簡単に説明していきますよ。

(1) コアランタイム

このランタイムは PowerBuilder アプリケーションを動かすためのベースとなるランタイムです。 こちらはすべて配布することが推奨されています。

ファイル名説明
pbvm.dllすべて
pbshr.dllすべて (pbvm.dll は、このファイルに依存しています)
libjcc.dllすべて (pbvm.dll は、このファイルに依存しています)
libsybunic.dll ※すべて (pbvm.dll は、このファイルに依存しています)
libjutils.dll ※すべて (libjcc.dll は、このファイルに依存しています)
libjtml.dll ※すべて (libjcc.dll は、このファイルに依存しています)
nlwnsck.dll ※すべて (libjcc.dll は、このファイルに依存しています)
pbuis.dllすべて (pbvm.dll は、このファイルに依存しています)
pbdwe.dll, pbdwr.pbdデータウィンドウおよびデータストア
pbsysfunc.dllシステム関数
pbresource.dllPowerBuilder リソースファイル
pbacc.dll, PBAccessibility.dllUI のアクセシビリティと自動化のサポート
pbjvm.dll, pbjag.dllJava サポート
pbtra.dll, pbtrs.dllデータベース接続のトレース
pbdpl.dllデータパイプライン サポート
pbcomrt.dllCOM/COM+ サポート

※印がついたファイルは 64-bit アプリケーションでは不要です。

(2) Microsoft ファイル

こちらは Visual C++ ランタイムです。 PowerBuilder 自体が C++ でつくられているため、上記の PowerBuilder のランタイムを動かすためにも必要なファイルになります。 Microsoft のサイトから「Visual C++ 2010 再頒布可能パッケージ」をダウンロードしインストールすることでも配布ができますが、必要なファイルのみをコピーしても OK です。 PowerBuilder 2019 R3 で必要になるのは下記の 3 つのファイルです。

  • atl100.dll
  • msvcr100.dll
  • msvcp100.dll

※これらのファイルも 32-bit 版と 64-bit 版で分かれているため間違えないようにしましょう!

(3) 機能ごとのランタイム

これらのランタイムは実装した機能によって選択します。

たとえば、SaveAs 関数でデータウィンドウのデータを XLSX 形式で出力したい場合は “PBDWExcel12Interop.dll” と “Sybase.PowerBuilder.DataWindow.Excel12.dll” の 2 つのファイルを配布します。

ファイル名説明
pbhttpclient.dllHTTPClient のサポート
pboauth.dllOAuth 2.0 のサポート
pbrestclient.dll、pbhttpclient.dll、pboauth.dll、pbcompression.dll、pbjson.dllRESTClient のサポート
pbwebbrowser.dll (およびその依存 DLL:chrome_elf.dll、d3dcompiler_43.dll、d3dcompiler_47.dll、libEGL.dll、libGLESv2.dll、libcef.dll、swiftshader/libEGL.dll、swiftshader/libGLESv2.dll) および “pbcef” フォルダーWebBrowser のサポート
pbrtc.dll、PBTXTEXT.dll、podofo.dll、tp4ole15.ocx、tp15.dll、tp15_bmp.flt、tp15_css.dll、tp15_doc.dll、tp15_dox.dll、tp15_gif.flt、tp15_htm.dll、tp15_ic.dll、tp15_ic.ini、tp15_jpg.flt、tp15_obj.dll、tp15_pdf.dll、tp15_png.flt、tp15_rtf.dll、tp15_tif.flt、tp15_tls.dll、tp15_wmf.flt、tp15_wnd.dllTX テキストコントロール ActiveX 15.0 (32-bit)
pbrtc.dll、PBTXTEXT.dll、podofo.dll、tx4ole28.ocx、tx28.dll、tx28_tls.dll、tx28_wnd.dll、tx28_obj.dll、tx28_ic.dll、tx28_rtf.dll、tx28_htm.dll、tx28_doc.dll、tx28_xml.dll、tx28_css.dll、tx28_pdf.dll、tx28_dox.dll、tx28_xlx.dll、MFC90U.DLL、MSVCR90.DLL、MSVCR120.DLL、MSXML3.DLL、MSXML3A.DLL、MSXML3R.DLL、Microsoft.VC90.CRT.manifest、Microsoft.VC90.MFC.manifestTX テキストコントロール ActiveX 28.0 (32-bit)
pbrtc.dll、PBTXTEXT.dll、podofo.dll、tx4ole28.ocx、tx28.dll、tx28_css.dll、tx28_doc.dll、tx28_dox.dll、tx28_htm.dll、tx28_ic.dll、tx28_obj.dll、tx28_pdf.dll、tx28_rtf.dll、tx28_tls.dll、tx28_wnd.dll、tx28_xlx.dll、tx28_xml.dll、mfc90u.dll、msvcr90.dll、msvcr120.dll、MSXML3.DLL、MSXML3A.DLL、MSXML3R.DLL、Microsoft.VC90.CRT.manifest、Microsoft.VC90.MFC.manifestTX テキストコントロール ActiveX 28.0 (64-bit)
pbcompression.dll圧縮のサポート
pbcrypt.dll暗号化と復号化のサポート
pbjson.dllJSON サポート
PBDWExcel12Interop.dll、Sybase.PowerBuilder.DataWindow.Excel12.dllMS Excel12 のサポート
pbpdf.dllNativePDF のサポート
PBDOM.pbxPB DOM
PBRibbonBar.dll (およびその依存 DLL:PBXerces.dll、xerces-c_2_8.dll、xerces-depdom_2_8.dll、pbjson.dll)RibbonBar のサポート
pbtheme.dll、pbjson.dll、および “theme” フォルダーUI テーマのサポート
PBXerces.dll、xerces-c_2_8.dll、xerces-depdom_2_8.dllXML サポート
PBDotNet.dll、PBDotNetFrameworkInvoker.dll、PBDotNetCoreInvoker.dll.NET アセンブリ呼び出し
pblab.iniラベルデータウィンドウ提示様式の定義

(4) DB インターフェイスのランタイム

アプリケーションからデータベースに接続する場合に必要です。 接続に使用している DB インターフェイスによって適切なファイルを選択します。

たとえば Microsoft SQL Server では Native Client のサポートが終了し、新しい OLE DB プロバイダーである「Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL)」の利用を推奨しています。 アプリケーションでこの MSOLEDBSQL インターフェイスを利用している場合は pbmsoledbsql.dll を配布します。

ファイル名説明
pbin9.dllInformix v9.x (IN9)
pbi10.dllInformix v10.x および v12.x (I10)
pbo90.dllOracle 9i (O90)
pbo10.dllOracle 10g (O10)
pbora.dllOracle 11g 以降 (ORA)
pbmsoledbsql.dllSQL Server (MSOLEDBSQL)
pbsnc.dllMicrosoft SQL Server (SNC)
pbdir.dllDirectConnect (DB)
pbase.dllAdaptive Server 15.x および 16.x (ASE)
pbsyc.dllAdaptive Server Enterprise (SYC)
pbodw.dll、pbodt.dll、pbCSI.dll、Sybase.PowerBuilder.DataSource.OData.dll、Sybase.PowerBuilder.ODataClient.dll、Sybase.PowerBuilder.ODataWrapper.dllOData データベースインターフェイス (ODT)

以上が主なランタイムファイルです。 この中から必要なファイルを選択していけば動くはずです。 もし外部関数などで他社のライブラリを使用している場合には別途配布する必要があるのでお忘れなきよう・・・。


アプリケーション XML によるランタイムファイルの参照

さて、PowerBuilder 2019 R3 では新しい機能としてランタイムファイルのパスを指定できるようになりました。 環境変数 PATH にパスを登録しなくても、好きな場所にあるランタイムを参照できるようになっています。

Yama-chan のブログでも軽く触れられていますが、プロジェクトペインタの [実行] タブに「アプリケーション XML のランタイムパス」という設定が追加されていますね。 2019 R3 では「配布」を行うと、問答無用で アプリケーション名.xml というファイルが生成されるようになったんですが、その中身はと言うと、こんな感じ。

<Application>
    <RuntimePath>C:\Program Files (x86)\Appeon\Common\PowerBuilder\Runtime 19.2.0.2722</RuntimePath>
</Application>

この <RuntimePath> というタグに囲まれているのが「アプリケーション XML のランタイムパス」で設定したパスです。 生成された XML ファイルを EXE と同じフォルダーに配置することで、 EXE を実行した際に XML に記載された RuntimePath のフォルダーを参照してアプリケーションが動作します。

上記の例のように絶対パスとして指定することもできますが、相対パスによる指定も可能です。 相対パスで指定した場合は EXE からの相対的な位置になります。 たとえば実行環境で EXE があるフォルダーのひとつ上の階層に “Runtime” というフォルダーを作成し、そこにランタイムファイルをコピーする場合、「アプリケーション XML のランタイムパス」には “..\Runtime” と指定します。 絶対パスで指定するよりこちらの方が現実的ですよね。 またアプリケーション XML はユーザーによる編集も可能なので、ユーザーがランタイムファイルの場所を変更した場合は XML ファイルに記載されたパスを変更してもらえば OK です。

なお、XML ファイルを配布しなくてもアプリケーションを実行することは可能です。 XML ファイルを配布しない場合は、これまでのバージョンと同様に EXE と同じフォルダーに必要なランタイムを配置するだけです。 なんだかんだ一番手っ取り早いのはこの方法でしょうかね。


ランタイムの配布とアプリケーションの実行

最後は実際にユーザーの端末に配布するわけですが、上記で選定したランタイムファイルと EXE、および動的ライブラリ (PBD もしくは DLL)、それから必要に応じて画像などのリソースを丸ごとコピーするだけです。 ランタイムパスとして絶対パスが指定されていなければ、どこにコピーしても動作するはず。

そうそう。 以前、「PBD を生成せずに EXE のみで動かしたいけど、実行するとエラーになる」というお問い合わせがありました。 これ、原因を探っていったところ、データウィンドウを利用している場合は使用しているデータウィンドウオブジェクトが含まれる PBL を動的ライブラリとして配布しないとオブジェクトが参照できないということが判明しました。

ユーザーさんは EXE のみで配布したいということで困っていたんですが、これにはちゃんと解決方法が用意されていたんです。 画像ファイルやアイコンと同じように、データウィンドウオブジェクトをリソースとして EXE に埋め込んであげればよいのです (ちゃんとマニュアルに記載されていました・・・)。

配布を行う前にリソースファイル (*.pbr) を用意し、テキストエディタ等で「PBL 名(データウィンドウオブジェクト名)」と 1 行ずつ記述します。 このような感じ。

[sample.pbr]

sample1.pbl(d_list01)
sample1.pbl(d_list02)
sample2.pbl(d_invoice)
sample3.pbl(d_receipt)

作成した pbr ファイルをプロジェクトペインタの [全般] タブ「リソース ファイル名」で指定してから配布を行えばデータウィンドウオブジェクトが EXE に埋め込まれ、PBD (もしくは DLL) を配布する必要がなくなります。

あ、上記の例は PBL がターゲットと同じフォルダーにある場合なので PBL ファイル名のみを指定していますが、ターゲットとは別のフォルダーに PBL があって、その PBL 内のデータウィンドウオブジェクトを使用する場合は PBL をフルパスで指定してあげてください。


まとめ

さあ、配布したアプリケーションはうまく実行できたでしょうか? IDE からの実行ではうまくいくのにユーザーの端末では実行できない、なんて場合は大抵がランタイムの不足によるものです。 失敗したときのパターンとしては「EXE を起動してもうんともすんとも言わない」、「起動直後にエラーメッセージが表示される」などさまざまですが、起動しないときは下記の点をしっかり確認してみてください。

  • 不足しているランタイムファイルはないか?
  • ランタイムファイルは参照できる位置に格納されているか?
  • ランタイムファイルのプロセス (32-bit/64-bit) は合っているか?
  • 動的ライブラリ (PBD/DLL) に配布漏れはないか?
  • 動的ライブラリを配布しない場合、データウィンドウオブジェクトをリソースファイルに含めているか?

本番環境でいざ実行! というときにアプリケーションが動作しないと焦ってしまいますよね。 用心には用心を重ねて、あらかじめ PowerBuilder IDE がインストールされていない環境で動作確認を行うことが大事です。

配布が面倒なときは「ランタイムパッケージャ」の利用も検討してほしいですが、2019 R3 から追加された画期的な配布方法である PowerClient もぜひお試しください!

 

以上、エイタでした!

テクニカルブログ 一覧を見る
PowerBuilder マイグレーション
PowerBuilderとは? ~デキる大人へ変身できる?ローコード開発ツール~