HSPエラー38 「外部DLLの呼び出しに失敗しました」

プログラミングツールHSP(Hot Soup Processor)のエラーメッセージ「HSP Error」(HSPエラー)エラーの番号は「38」。エディタ上のコンパイル実行では『外部DLLの呼び出しに失敗しました』のメッセージ。実行ファイルでのエラーメッセージは『内部エラーが発生しました(38)』。

HSP3スクリプトエディタ上でのコンパイル実行では別に問題は起こらなかったけれど、作成出力した実行ファイルをいざ起動してみると、いきなり表示されてしまうエラーダイアログ。HSP関連掲示板でもよく見かけるエラートラブルですなぁ。

拡張プラグインの命令を使ってませんか?

HSPには拡張プラグインという機能が用意されてます。標準の命令では実現できない機能を利用できるもので、 HSP3では下のようなものが用意されとります。これ以外にもHSPユーザーさんが製作した拡張プラグインもあります。

こられはすべてDLLファイルで提供されてます。DLLは「Dynamic Link Library」のことで、「*.dll」というファイル形式になります。実行ファイル(*.exe)本体とともに、 このDLLファイルの2ファイルが存在して始めて拡張機能が利用できるわけ。(HSP向け拡張プラグインを示す目的で 「*.hpi」という拡張子が付けられてるものもあります。)

スクリプトエディタ上でのコンパイル実行では、HSP開発環境自体にこのDLLファイルが存在してるのでエラー は出ませんが、スクリプトを実行ファイルとしてコンパイル出力し、別フォルダにこの実行ファイルだけを移動 したりすると、起動時にHSPエラー(内部エラー)となります。

このエラー番号38は、拡張プラグインの命令を利用 してるにもかかわらず、その拡張プラグイン(DLLファイル)が実行ファイルと同じフォルダに存在しない 場合に表示されます。
 自分のホームページでプログラムを配布する際は、実行ファイル(*.exe)と いっしょにコピーしたDLLファイル(*.dll、*.hpi)も同封させて公開しましょう。それぞれHSP拡張プラグインの Readmeファイルには同封するよう記述が絶対にあるので、取説は読まないタイプな人がぶち当たる可能性が高い かも? (^^;

☆ プラグインとヘッダーファイル

他にも、拡張プラグインファイル(*.dll、*.hpi)と拡張プラグインを定義するヘッダーファイル(*.as)の バージョンが合致してない場合にHSPエラーになる可能性があります。プラグイン本体、定義データファイル、その プラグインを説明するマニュアルの内容がバラバラでは意味がありません。
 更新頻度が多いHSP拡張プラグイン(たとえば「Easy3D」)でよく見かける事例です。

DLLファイルを付けずに実行ファイル単体で配布したい!

無理です。
 HSPがサポートするPACKFILE機能(パックファイル)を使って実行ファイル内 にDLLファイル、HPIファイルを埋め込めばいいかも?、なんてことを考える人がいるかもしれませんが、これでは 拡張機能をまったく利用できません。DLLファイルというのは、ハードディスク上にファイルとして存在してないダメ です(Windows自体の仕様)。

いちおう例外もあります。

拡張ランタイムの形式で唯一提供されてるのが「HGIMG3」です。HSPのリファレンスには、 『拡張プラグイン HGIMG3.DLL』という形で紹介されてる場合がありますが、これは単なる誤記です。このような名前の DLLファイルはHSPの開発環境に存在しないのでご注意を。(HSP 3.2〜で誤記は修正されてます)

拡張ランタイムについては、『プログラミングマニュアル1・基本仕様ガイド (hspprog.htm)』の「1.プログラミングガイド→拡張ランタイム」を参照してください。このランタイムを開発するには、DLLを作成できる開発環境(Visual C++など)と、Win32プログラミングの知識が必要です。

◆ DLLファイルとHPIファイル

上にも書いたように、HSPの拡張プラグインには「*.dll」と「*.hpi」の2種類のファイル名(拡張子)が あります。これは全く同等のデータで、HPIは「HSP Plug-in Interface」からきてます。
 DLLファイルは「隠しファイル」ということでWindowsのデフォルトの設定では非表示扱いになってるので、単純に 拡張子を変更しておくことで、エクスプローラなどで常にファイルとして表示されるものにするのが目的です。

ちなみに、この拡張プラグインをHSPで作成することはできません。スクリプト言語HSPはネイティブコンパイラは 搭載してないので、Visual C++などを利用して作成する必要があります。(HSP開発wiki

◆ ユーザーからのエラー報告を防ぐ

デフォルトではDLLファイルは「隠しファイル」扱いなので、ユーザーはDLLファイルの存在に気づかぬまま、 実行ファイルだけ別のフォルダに移動させて起動してしまう可能性があります。また、拡張子をHPI形式にして あったとしても、ユーザーが不要なファイルと勝手に判断して削除してしまうこともありえます。
 HSPを知らないユーザーには、「内部エラーが発生しました(38)」のダイアログでは何が悪いのかさっぱり 分かりません。というか、HSP利用ユーザーですらこのエラー名についてたずねる人がいるわけで・・・。(^^;
 このままでは作成したプログラムが「ごみ箱」へと直行される恐れもあるので、HSPのexist命令でDLLファイルの 存在を確認する処理を、スクリプトの最初あたりで保険としての用意しとくことをオススメします。

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク