こんにちは。
現在、VisualStudio2008(VC++2008)環境でWindowsフォームアプリケーションを開発して
おります。(PG暦半年、初心者です。(--;))
ビルド後、生成されたEXEファイルをクリックすると、コーディングを行った環境では動
作するのですが、それ以外のVS2008のインストールされていない環境ではEXE実行直後
に問題が発生したため...終了します。のメッセージが表示され実行できません。
何か対策ご存知の方おられましたらご教示お願いします。
(詳細)
現象--
VS2008環境でビルドしたフォームアプリケーションがVS2008インストール
されていない環境では実行できない。
(Debug、Releaseビルド共通)
開発(実行可)環境---
・WindowsXP SP1
・VisualStudio2008Std(VC++2008)
・.netFrameWork
(1,CLR,PreXP,CS,2,ASP.NET,CRT,WinForms
2.0Sp1,3.0sp1)
実行不可環境(1)--
・Windows2K SP4
・VisualStudio2005Exp(VC++2005)
・.netFrameWork2.0sp1
実行不可環境(2)--
・WindowsXP SP1
・.netFrameWork2.0sp1
対応--
(1)実行できない環境で止まっている箇所を調べようとmain内、フォームコンストラク
タ内の各処理にMessageBox::Show(処理名関数名)を挟み込んで実行
*実行不可環境では一つもMessageBoxは出てこない。
*実行可能環境では全てのMessage表示後起動。
(2)[新規作成]>[プロジェクト]>[Windowsフォームアプリケーション]から新たにアプ
リケーション作成。何もせずそのままビルド。
*同様に実行不可
(3)実行不可環境でDependencyWalkerを実行。
不足するDLLをEXEファイルと同フォルダに同梱>実行。
*同様に実行不可
(4)VS2008デバッガで問題のEXEを検証
*以下メッセージ表示されデバッグにも至らず。
'System.IO.FileLoadException' のハンドルされていない例外が 不明なモジュールで
す。 で発生しました。
追加情報: ファイルまたはアセンブリ [[App名]], Version=1.0.3092.24755,
Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めません
でした。要求された最小限のアクセス許可を与えることができませんでした。 (HRESULT
からの例外: 0x80131417)
(5)プロジェクトプロパティ>[構成プロパティ]>[C/C++]>[コードの生成]>[ランタイ
ムライブラリ]>マルチスレッド デバッグ (/MTd)からマルチスレッド (/MT)に変更し
ビルド。
*以下コンパイルエラービルド不可
コマンド ライン error D8016 : コマンド ライン オプション '/MT' と '/clr:pure'
は同時に指定できません
...以後、(5)を元に戻すも同じコンパイルエラーが表示されビルドすら不可に(後悔)
.NET3.0を必要とするexeを.NET2.0で動かそうとしてるからじゃないんかなー
VS2008なら.NET2.0対応exeを作れます。そいつで試してみるが吉かと。
早速のレスありがとうございます!
たぶん(...すみません)2.0を対象としてビルドされてると思います。
プロジェクトのプロパティの中で[対象のFrameWork]的な項目があるのですが、
.NET FrameWork2.0になってましたので。
ただおっしゃる通り、原因はEXEファイルが実行可能環境上の何だかのリソースに依存
している為だと思うんです。
DLLやら外部参照やら関連付けた覚えないんですが
(そもそもそんな方法を知らないという方が正しいですが(__;))
別のPCから実行する際に、
サーバー上の実行権限のないフォルダから実行していませんか?
C#2005でしたが、私も以前同じような例外が発生したことがあります。
ローカルにコピーしたら問題なく動作した記憶があります。
あと、Debugビルドになっているとか。
フォームアプリって事ですが…
[プロパティ>全般>MFCの使用>共有DLLでMFCを使用]になっていませんか?
KJさん・んー…さんレスありがとうございます!
>ローカルにコピーしたら問題なく動作した記憶があります。
>あと、Debugビルドになっているとか。
ローカルでも実行は不可でした。
実行不可機はAdmin権限でしたので、こちらはOK。
Debug・Releaseビルド共にこんな状態です。
>[プロパティ>全般>MFCの使用>共有DLLでMFCを使用]になっていませんか?
標準 Windows ライブラリを使用する。
になっていました。
尚、今朝Visual C++ 2008 再頒布可能パッケージ (x86)なるものを
実行不可機にインストールしたところ、動作しました。
(インストール後所見)
【from MS】▽▽
このパッケージは、C Runtime (CRT)、Standard C++、ATL、MFC、OpenMP および MSDIA
ライブラリのランタイム コンポーネントをインストールします。..........
(WinSxS フォルダ) にインストールされます。
【from MS】△△
↑実際にc:\winnt\winsxsフォルダに追加された物をみてみると
x86_Microsoft.VC90.*フォルダ(4つ)に*.dllファイルがいくつか追加されていま
した。
実行に必要なDll不足が原因だったのかと思われます。
が...そもそも対応の(3)でDependencyWalkerでDLL補完は行われたはず
何ですが(私のつかいこなし術の問題(^^;)?)
それにしても、
んー…さんのご指摘にあったように標準 Windows ライブラリを使用する。
にしていても、暗黙的に何ぞMFCのライブラリが追加されているのか。
KJさんご指摘のようにc:\winnt\にアクセス権限ない場合単純にDLLを同梱しただけで
動作するのか。
当面の現象は解決したものの、いくつか疑問残です(?_?)
こちらについては追って調査してみます。
ご存知の方おられましたらアドバイスお願いいたします。
> 実行に必要なDll不足が原因だったのかと思われます。
> が...そもそも対応の(3)でDependencyWalkerでDLL補完は行われたはず
> 何ですが(私のつかいこなし術の問題(^^;)?)
Express Edition では、EXE と同じフォルダに DLL を入れる形態はサポートされないよ
うです。
素直に、実行するマシンに再頒布パッケージをインストールしてください。
http://msdn.microsoft.com/ja-jp/library/ms235291.aspx
あ、開発機は Standard か。失礼しました。
てことは、たぶん *.maifest が足りないんです。
上記のページにもありますが、C:\Program Files\Microsoft Visual Studio 9.0
\VC\redist\x86 にあるファイルを、*.dll と *.manifest を両方とも、実行環境に持っ
て行くとどうでしょうね。
ま、Standard であっても、再頒布パッケージを使うことが推奨されますが。
同じフォルダ同梱型は、よほどの事情がない限り避けるべきじゃないでしょうか。
たびたび失礼。
実行環境は Windows 2000 ですか。じゃあ manifest なんて関係ないかな?
…よくわかんなくなってきました。
週空けてしまいましたが、シャノンさん、ご推察ありがとうございます!
私も、.manifestなるものの存在を知り、いくつかプロジェクトをビルドして
読んでみたところ、
Debugビルドは→.....name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' .....
Releaseビルドは→.....name='Microsoft.VC90.CRT' version='9.0.21022.8' .....
それぞれ、何ぞ割り当てられていました。(本人には覚え無し(^^;))
実行可能機に再頒布Packインストール後はwinsxsフォルダ内にこれらが配置された為
動作できるようになった物と思われます。
が、
おっしゃる通り、win2kって.manifest対応してないんですね。
どうやって、EXEに必要なDLLを判断してるんでしょう。
EXEバイナリ内にしれっと書かれてあるんでしょうか(?_?)
分析を煩雑にするだけかもしれませんが、以下のような事を行ってみました。
実行不可環境(1)【Win2K】>
再頒布Packで追加されたVC90系ファイル郡を全て削除(shift+DEL) >
もちろん実行できなくなるはず!>
【実行!】>
【実行できました...orz】
>>…よくわかんなくなってきました。
私もよくわかんなくなってきました。
一回実行されて何かWin2K機側で覚えたんですかね。
とりあえず、実行はさせられるようにはなったという事で、
周囲のPC人柱にしながら、ご指摘を踏まえて以下のような条件で配布を試みてみます!
(実行不可なら、再頒布Packインストールにて対応です!安直ですが...)
(XP機)
・EXE+manifest同梱
・EXE+manifest+必須DLL同梱
・EXE+必須DLL同梱
(2k機)
・EXE+必須DLL同梱
まあ、そもそもデバッグ版に関しては開発環境を入れていない環境で
動かないはずです。
デバッグ版のランタイムは配布指定はいけない事になっているので
他のマシンに入れるのも基本的には駄目なはずですし。
リリース版の場合動作しないのはランタイムライブラリが入っていない
所為ですね。Win2000ならVC2008のランにタイムは入っていなくて
当たり前なので素直にランタイムをインストールするのが正解だと
思います。
多分、再頒布パッケージをインストールするのが一番安全では無いかなぁ。
あうあう、誤字
誤)
デバッグ版のランタイムは配布指定はいけない事になっているので
正)
デバッグ版のランタイムは配布してはいけない事になっているので