VisualBasic6.0(以下、VB6)にて、

アプリケーションの作成→インストール→実行を行いましたが、
以下の理由により、起動しません。

実行時エラー'49'
Active X コンポーネントはオブジェクトを作成できません
実行時エラー '53'
ファイルが見つかりません

原因と対策について、ご教授ください。

<経緯>
1. VB6にて、アプケーションAを作成
2. VB6にて、Aからコールされる関数を含むDLL Bを作成
3. DLL Bをregsvr32 コマンドでレジストリへ登録。
4. Aの実行(DLL定義の関数のコール)を確認。
5. ディストリビューションウィザードを使用して、アプリケーションAの
 プロジェクトを指定して、setup.exeを作成。
 この時、ファイル追加指定にて、「DLL B」を指定。
6. 作成したセットアップファイル一式を別環境(別のPC)へコピー
7. インストールを実施。
 →インストールは成功しました。
8. スタートメニュー→プログラム→アプリケーションAを起動。
 →エラー発生により、アプリケーション起動せず。

regsvr32を手作業にて実行し、DLL Bを登録した後は、
実行時エラー '53'
とのエラーとなります。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2008/05/19 14:02:57
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント10pt

この時、ファイル追加指定にて、「DLL B」を指定。

この部分ですが、フルパスで指定していませんか?

または、DLL B が 実行形式ファイルとは別の、PATHが通っていないディレクトリにインストールするような設定になっていませんか?


アドレスはダミーです。http://www.hatena.ne.jp/

id:futurista

回答有難うございます。

>> この部分ですが、フルパスで指定していませんか?

フルパスでないとは、カレントとするのでしょうか?その指定をどこで行うのでしょうか?

>>または、DLL B が 実行形式ファイルとは別の、PATHが通っていないディレクトリにインストールするような設定になっていませんか?

よくわかりません。どういう意味でしょうか?

2008/05/15 22:18:48
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント5pt

DLLは EXEと同じところに 置いてみたらいかがでしょうか?

また、そのDLLから参照しているDLL等は ありませんでしょうか?


http://okwave.jp/qa3507515.html

id:futurista

回答有難うございます。

>>DLLは EXEと同じところに 置いてみたらいかがでしょうか?

開発環境での話しですか?インストール先での話しですか?

>>また、そのDLLから参照しているDLL等は ありませんでしょうか?

そのDLLとはDLL Bのことでしょうか?

参照しているDLLとは、どのように調査すればよいですか?

どこかにパスが記載されているのでしょうか?

2008/05/15 22:20:56
id:pahoo No.3

回答回数5960ベストアンサー獲得回数633

ポイント10pt

#1 で回答した者です。

DLL B については、ディストリビューションウィザードのセットアップ先で $(AppPath) になっているかどうか確認してください――ということを言いたかったのですが‥‥開発者向けマニュアルで、ディストリビューションウィザードについて読み込んでください。また、インストーラー全般に関して学んでください。

id:futurista

回答有難うございます。

DLL Bのセットアップ先のフォルダ指定は、

$(WinSysPath)、$(AppPath) いずれも試行しましたが、

ダメでした。

2008/05/17 17:12:57
id:taknt No.4

回答回数13539ベストアンサー獲得回数1198

ポイント5pt

>開発環境での話しですか?インストール先での話しですか?

エラーが出てるのは、どこでしょうか?


>>>また、そのDLLから参照しているDLL等は ありませんでしょうか?

>そのDLLとはDLL Bのことでしょうか?

>参照しているDLLとは、どのように調査すればよいですか?

>どこかにパスが記載されているのでしょうか?

DLL Bです。

DLL Bは、どのように作っているのでしょうか?

あと、DLL BのバージョンとアプケーションAで記憶されているバージョンが違う恐れがあります。

DLL Bを 再度 作り直して その作り直した DLL Bを用いてアプケーションAを作ってみたらいかがでしょうか?

インストールしなおすときは、DLL Bをきちんと regsvr32 /u で 解除してからにしましょう。

http://home.att.ne.jp/banana/akatsuki/doc/other/windows01/

id:mj99 No.5

回答回数138ベストアンサー獲得回数38

ポイント50pt

まず、

・「DLL B」はActiveX DLLである

・「アプリケーションA」には「DLL B」の参照設定を追加していない。

・「アプリケーションA」から「DLL B」をコールするときCreateObjectを使用している。

という前提でよろしいでしょうか?

上記の前提であれば、手順に大きく間違ったところはないと思います。

----

ところでService Packは最新でしょうか?

VB6のメニュー「ヘルプ」→「バージョン情報」で確認してください

Microsoft Visual Basic 6.0(SP6)

などと表示されているはずです。カッコ内がService Packの番号です。

最新はService Pack6のようです。

ダウンロードの詳細 : VB 6.0 SP6

----

Service Pack6がインストールされた状態で、

以下の手順を試してください。

1. VB6にて「DLL B」の実行ファイルを作成する

 →VBメニューの「ファイル」→「XXX.DLLの作成...」

2. VB6にて「アプケーションA」の実行ファイルを作成する

 →同上

3.「アプケーションA」のプロジェクトフォルダから「?????.PDM」を削除する

 →Service Pack6適用前のファイルなので、今回に限り削除。

4. ディストリビューションウィザードを使用して、

 「アプリケーションA」のセットアップパッケージを作成する

 →途中、ファイル追加指定にて「DLL B」を指定。

5. 作成したセットアップファイル一式を別環境(別のPC)へコピー

6. インストールを実施。

7. スタートメニュー→プログラム→「アプリケーションA」を起動。

*開発PC上でregsvr32を実行する必要はありません。

 →上記手順1で自動的に登録されます。

*インストール先でregsvr32を実行する必要はありません。

 →インストーラがやってくれます

 →アンインストーラがregsvr32の登録解除も実行してくれます。

id:futurista

回答有難うございます。

・「DLL B」はActiveX DLLである

 →はい。

・「アプリケーションA」には「DLL B」の参照設定を追加していない。

 →はい。但し、regsvr32 でファイルを指定して登録していいます。

 regsvr32 /uすると、アプリケーションは起動しなくなります。

・「アプリケーションA」から「DLL B」をコールするときCreateObjectを使用している。

 →はい。以前、教授して頂いた通りです。

SP6はインストールしておりませんでしので、

バージョンアップしました。

ご指摘頂いた手順により、setup.exeの作成・インストールを

実施しましたがセットアップ先で、起動しませんでした。

DLL Bのセットアップ先のフォルダ指定は、

$(WinSysPath)、$(AppPath) いずれも試行しましたが、

ダメでした。

なお、現在のエラーは、

「実行時エラ'53' ファイルが見つかりません」

ですので、DLL Bが参照出来ないためのエラーでは無いようです。

2008/05/17 17:14:58
id:mj99 No.6

回答回数138ベストアンサー獲得回数38

ポイント30pt

う~ん、解決しませんでしたか、申し訳ない。

手順はあっているはずです。。。

Service Packついては、

ディストリビューションウィザードがかなり改修されている(と記憶している)のでService Packはインストールしておいて損はないでしょう。

----

ふと気になったのですが、状況は「起動しない」なのですね。

アプリケーションAにおいて、DLL Bが利用されるタイミングはどうなっているのでしょう。

・Sub MainでCreateObjectを使っている?

・初期に表示されるフォームのForm_loadでCreateObjectを使っている?

上記どちらでもないとすると、とりあえず起動するはずなんですが。

----

CreateObjectを使う箇所をフォームボタンクリックなどに記述を移して、

その場所でエラーが発生しているかを確かめてみましょう。

----

変化球で、

前回の質問にあったDeclare Function宣言が残ったままで、それが邪魔しているとか。

アプリケーションAにも、DLL BにもDeclare Functionは無いですよね。。

ファイルが見つかりません。(Visual Basic ランタイム エラー)

id:futurista

回答有難うございます。

SPについては、そうですね。

(SP5までしか入っていませんでした。よくお気づきで。。)

>> ふと気になったのですが、状況は「起動しない」なのですね。

>>・初期に表示されるフォームのForm_loadでCreateObjectを使っている?

ご指摘のとおりです。

初期表示のFormから、CreateObjectの記述をコメントしてみましたが、

状況は変わりませんでした。

「実行時エラ'53' ファイルが見つかりません」

とのエラーが出ております。

DLL Bで無く、他のDLLが見えていないのではないかと推測しております。

>>アプリケーションAにも、DLL BにもDeclare Functionは無いですよね。。

確認したところ、有りませんでした。

お手数ですが、他に確認する点があるようでしたら、

ご指摘をお願いします。

環境についての記述が足りませんでしたね。

開発環境:Win2000SP4 / VisualBasic6.0SP6

インストール先環境:Win2000SP4 / VisualBasic6.0SP4がインストールされいます。

2008/05/18 16:33:15
  • id:cx20
    > DLL Bで無く、他のDLLが見えていないのではないかと推測しております。

    どの DLL のロードに失敗しているか?の調査には、
    「Dependency Walker」というツールが重宝します。

    ■ Dependency Walker (depends.exe) Home Page
    http://www.dependencywalker.com/
    http://www.dependencywalker.com/depends22_x86.zip

    このツールは、EXE/DLL 間の依存関係を調査する為のツールです。
    CreateObject 等により動的にロードしているコンポーネント(ActiveX DLL)等も
    「プロファイル実行」という機能で調査することが可能です。

    <「プロファイル実行」の使用方法>
    1. 解凍したディレクトリより [Depends.exe] を起動します。
    2. メニューより [File] - [Open] を選択します。
      調査対象の EXE ファイルをオープンします。
    3. メニューより [Profile] - [Start Profiling...] を選択します。
      作業ディレクトリ、コマンド引数等に問題なければ [OK] ボタンを押下します。
      → ロードに失敗している DLL があれば、その DLL 名が表示されます。
  • id:futurista
    コメント有難うございます。

    教授して頂いたツールを用いて、
    環境を調査しましたころ、
    APPHELP.DLL
    SXS.DLL
    が足りないことがわかりました。
    (但し、この二つのDLLは開発環境PCにも入っていませんでした。
     開発環境PCで何故、起動したのか謎。。)

    足りなかった上記のDLLは、XPマシンから調達して、
    新たにセットアップパッケージに作成しました。

    しかし、やはり起動しませんでした。

    試しに再度、ツールを用いて再度、依存関係を調査したところ、
    以下のエラーメッセージが出ておりました。

    GetProcAddress(0x77E50000 [KERNEL32.DLL], "IsTNT") called from "OLEAUT32.DLL" at address 0x779F4542 and returned NULL. Error: wvV[WB (127).

    GetProcAddress(0x77E50000 [KERNEL32.DLL], "IsTNT") called from "MSVBVM60.DLL" at address 0x66001BD5 and returned NULL. Error: wvV[WB (127).

    LoadLibraryA("SXS.DLL") returned NULL. Error: wvV[WB (127).

    エラーの出ている
    OLEAUT32.DLL
    MSVBVM60.DLL
    SXS.DLL
    は、いずれもセットアップパッケージに内包されています。
  • id:mj99
    そのエラーが「起動しない原因」になっているかどうかを判断する必要があると思います。

    > 環境を調査しましたころ、
    > APPHELP.DLL
    > SXS.DLL
    > が足りないことがわかりました。
    > (但し、この二つのDLLは開発環境PCにも入っていませんでした。
    >  開発環境PCで何故、起動したのか謎。。)

    「開発環境で」アプリケーションAをdependencywalkerで実行するとどうでしょう?

    私も実際ためしたのですが、
    ・VB6でアプリケーションを作った
    ・ディストリビューションでインストーラを作った
    ・別PCにインストールした。
    ・インストールしたアプリケーションが起動することを確認した。
    ・dependencywalkerでアプリケーションを起動した。
    上記手順で、アプリケーションは実行できるのですが、OLEAUT32.DLL、MSVBVM60.DLLあたりでエラーが出ています。(つまり、このエラーは起動しない原因ではない)

    SXS.DLL、APPHELP.DLLについてはわかりません。。。
  • id:cx20
    APPHELP.DLL や KERNEL32.DLL の IsTNT が見つからないというエラーは無視して大丈夫です。
    SXS.DLL も無視して大丈夫そうな気がします。

    と、なると「実行時エラ'53' ファイルが見つかりません」は、別の原因のような気がします。
    プログラム内で、何かしらファイルをオープンしようとしてエラーになっているとか?

    そのような場合は「FileMon.exe」というツールで調査可能です。

    ■ FileMon for Windows
    http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx

    <FileMon の使用方法>
    1. 解凍したディレクトリより [FileMon.exe] を起動します。
    2. メニューより [File] - [Capture Events (Ctrl+E)] を選択します。
      → ログの収集が開始されます。
      → ファイルの読み込みに失敗している場合 Result 列に「FILE NOT FOUND」が表示されます。
    3. 中断する場合は、再度 [File] - [Capture Events (Ctrl+E)] を選択します。

    ただし、ログが大量に出力される為、どれが OK で、どれが NG かを判断するのは難しいかもしれません。
    必要に応じてプロセス名や実行時間等で絞込みをしてみてください。

    <参考情報>
    ■ Dependency Walker Frequently Asked Questions (FAQ)
    http://www.dependencywalker.com/faq.html

    Q. Dependency Walker says I'm missing APPHELP.DLL. Where can I get it from?
    A. Windows 2000 では使用していない為、無視して構いません。

    Q. Why are some modules looking for a function named "IsTNT" in KERNEL32.DLL?
    A. 無視して構いません。
  • id:mj99
    良く考えたら、、そもそも、依存関係にあるDLLが存在しない場合、
    「実行時エラー」にはならず、「***.DLLが見つかりません」と言ったエラーになるんですよね。

    ----
    実行時エラー53になりそうなもの、、、、
    ・Open、Kill、Nameステートメントを使っていて、その引数(ファイル名)が異常。
    ・フォーム上に配置したコントロールのプロパティにファイル名を指定するものがあり、それが異常。
    *DDeclareのLib節のが異常。(この場合、「実行時エラー53~。****.DLL」とファイル名まで出る)
  • id:futurista
    >> mj99さん
    >> cx20さん

    コメント有難うございました。
    申し訳有りません。ごく単純なミスでした。。

    アプリケーションA、及びDLL Bとも
    必要なパラメータは、ファイル読み込みにすることにしていたのですが、
    そのファイル(XXX.ini)をセットアップパッケージに内包するのを忘れておりました。

    インストール先環境のEXEファイルのカレントにXXX.iniを
    配置したところ、アプリケーションが起動することを確認しました。

    自作DLLを参照するアプリケーションの作成は、初めてだったため、
    DLL絡みのミスだと思い込んでおりました。

    結局のところは、「FileMon.exe」を使うことによって気付いたので、
    アドバイスは役に立ちました。

    本当に有難うございました。

  • id:futurista
    念のため、追記します。

    >>結局のところは、「FileMon.exe」を使うことによって気付いたので、
    >>アドバイスは役に立ちました。

    ただ、NOT FOUNDだったのは、
    XXX.iniだけでなく、以下もファイルもでした。

    MSVBVM60.DLL
    test_desu.exe.Local(→test_desuは、作ったアプリケーション名)
    IMM32.DLL
    test_desu.exe.cfg(→test_desuは、作ったアプリケーション名)
    SXS.DLL
    imejpknl.dll
    CLBCATQ.DLL
    netmsg.dll
    .HLP
    WINHELP.INI
  • id:taknt
    やはり呼んでるDLLが参照できなかったのか。

  • id:cx20
    補足です。

    > ただ、NOT FOUNDだったのは、
    > XXX.iniだけでなく、以下もファイルもでした。

    必ずしも「NOT FOUND」と出力されたファイルがすべて問題あるわけではありません。

    例えば、test_desu.exe.Local というファイルを探しに行くのは、
    Windows 2000 の「DLL/COM リダイレクション 」という機能がある為です。
    (この機能は、「~.exe.local」のファイルがある場合、ローカルの DLL/COM を参照するという機能です。)
    ですので、無いからと言って、必ずしもエラーというわけではありません。

    何が本当のエラーで、何が問題ないのか?を見極めるのは、
    経験的な部分もあるので一概には言えませんが、
    とりあえず、開発環境で、同様に FileMon.exe を実行して、
    「NOT FOUND」が表示されても問題なく動作しているのであれば、
    特に必要ないファイルと思われます。

    <参考情報(「~.exe.local」に関する情報)>
    ■ アプリケーションで共有する Side-by-Side コンポーネントの実装 (拡張)
    http://www.microsoft.com/japan/msdn/windows/windows2000/sidebyside.aspx
  • id:futurista
    重ね重ね有難うございます。
    参考にさせて頂きます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません