- ベストアンサー
VS2008のC++で作成したEXEの実行
- VS2008のC++で作成したEXEファイルを別のPCで実行する際にエラーが発生する
- エラーメッセージによると、アプリケーションの構成が正しくないため、再インストールが必要かもしれない
- 同じVisual Studio 2008のC#で作成した実行ファイルは正常に動作する
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>>単にバグを内包していてリリース版で問題が表面化しているだけの気がしますが。 >違う気がします。 VS2008から起動しても何も表示されずすぐ終了するなら十分バグです。 デバッグ版で問題がなくてもリリース版で動かないバグはプロでもやりがちなバグなので、あって当たり前だと思って下さい。初期化漏れ、配列の範囲外、ポインタ操作ミスなどが原因となります。 VS2008でデバッガが反応しないのであれば、意図した通りには動いてませんがプログラムはOSから見る限り正常に動いていると判断できます。 なので、こういう場合はウィンドウアプリならプログラムのあちこちに通過点をチェックするOutputDebugString()を埋め込むなどしてプログラムの何処を通ったか確認する必要があります。コンソールアプリならprintf()をあちこちに埋め込んで下さい。 あるいは下記の様にしてブレークポイントやステップ実行で終了指定してしまうポイントを見つけて下さい。 「方法 : リリース ビルドをデバッグする」 http://msdn.microsoft.com/ja-jp/library/fsk896zz.aspx
その他の回答 (7)
- Wr5
- ベストアンサー率53% (2173/4061)
そのダイアログリソースに何が付いています? と確認したつもりなのですが…… ダイアログにツリービューやリストビューがあった場合に、InitCommonControlsEx()などで初期化しないとダイアログ生成に失敗する。 という動作をすることがありますが。 >switch (msg) { にブレークポイントを設定して、まず、どんなメッセージが来ているのか…というのを確認する。 なんてのもアリかも知れませんが。 >DialogBox(hInstance, "IDD_DLGMAIN", NULL, (DLGPROC)DlgProc); の戻り値を確認する。とかもありでしょうかね。
お礼
再度の回答ありがとうございます。 DialogBox(hInstance, "IDD_DLGMAIN", NULL, (DLGPROC)DlgProc); の戻り値を確認したところ、デバッグモードでは1、リリースモードでは-1でした。 ということで、デバッグモードとリリースモードの違いをいろいろ調べたところ、何と 構成プロパティ - 全般 - 文字セット が デバッグモードでは、 マルチバイト文字セットを使用する リリースモードでは、 UNICODE文字セットを使用する になっていました。これをデバッグモードと同じ設定にしたところ、あっさり正常動作するようになり、しかもリリースビルドした実行ファイルは、別のPC(vcredist_x86.exeをインストールしたWinXP)で正常に動作するようになりました。 ありがとうございました
- Wr5
- ベストアンサー率53% (2173/4061)
>リリース版では、コールバック関数の >case WM_INITDIALOG: >に制御が来ることなく、プログラムが終了していることがわかりました。 そのダイアログにつけているリソース(コモンコントロール)はどんなのがあります? InitCommonControlsEx()とかの初期化を実施していなかったためWM_INITDIALOGまで進まない。 なんて事態に遭遇したことはありますけど……。
お礼
回答ありがとうございます。 >そのダイアログにつけているリソース(コモンコントロール)はどんなのがあります? ダイアログは、コールバック関数を DlgProc に指定して int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow){ g_hInstance = hInstance; DialogBox(hInstance, "IDD_DLGMAIN", NULL, (DLGPROC)DlgProc); return 0; } で呼ぶだけです。コールバック関数 DlgProc の先頭では LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: /* タイトルバー */ SetWindowText(hWnd, TITLEBAR); で処理を行っています。ダイアログが生成された初期にタイトルバーを表示するはずですが、ここに制御が来ないのです。
- zwi
- ベストアンサー率56% (730/1282)
情報が小出しにされているので全体的な状況がいまいちつかめておりません。 >VS2008のリリース版はエラーもありませんが無反応です。 こちらもSide-by-Side エラーだと思っていました。一応実行出来ているものと思われます。 この件に関しては開発PC上でVS2008からリリース版をF5実行した場合も同じでしょうか? 単にバグを内包していてリリース版で問題が表面化しているだけの気がしますが。 つまり、デバッグ版とは別件の問題です。
お礼
zwi様、何度も回答ありがとうございます。 >こちらもSide-by-Side エラーだと思っていました。一応実行出来ているものと思われます。 VS2008のリリース版は、DependencyWalkerでは、Side-by-Side エラーは検出されていません。 まったく実行されません。つまり、正常ならばウインドウが開いて入力待ちになるのですが、起動しても何も表示されず、エラーもなく、すぐ正常終了(?)してしまうのです。 >この件に関しては開発PC上でVS2008からリリース版をF5実行した場合も同じでしょうか? 同じです。まったく何も表示されず、すぐ終了します。F5を押しても、Releaseフォルダ内のEXEファイルをダブルクリックしても同じです。 >単にバグを内包していてリリース版で問題が表面化しているだけの気がしますが。 違う気がします。 >情報が小出しにされているので全体的な状況がいまいちつかめておりません。 どこに問題があるかわからない状態なので、適切な情報を報告できず、すいません。
- zwi
- ベストアンサー率56% (730/1282)
msvcr90d.dll自体が開発環境の一部なんですが・・・。 たぶん、その他のdllに問題があるんだと思います。 他の方が言われるようにDependencyWalkerで調べるか、イベントログに詳細なエラーが出ていると思うので調べて貼り付けて下さい。
お礼
再度回答ありがとうございます。 No2さんへのお礼に記載したとおり、不足するDLLはありません。 以下は、正常動作しないWinXPでDependencyWalkerを実行した結果です。 VS2008のリリース版は、エラーもありませんが無反応です。 VS2008のデバッグ版は、DLLの不足はありませんが、 「Error: Side-by-Side 設定情報の"XXX.exe"にエラーが含まれています.このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。 (14001).」 と表示されます。
- wormhole
- ベストアンサー率28% (1626/5665)
>>デバッグビルドしたプログラムは開発環境のないPCでは動作しません。 >msvcr90d.dllの入ったWin2000 では正常動作しますけど・・・ それは開発環境にしかない存在しないはずのDLLをWindows2000にいれてる状態(プログラムを実行させる分には開発環境と同じ状態)なので、それで正常動作するといっても意味ないですが・・・
お礼
回答ありがとうございます。 >それは開発環境にしかない存在しないはずのDLLをWindows2000にいれてる状態(プログラムを実行させる分には開発環境と同じ状態)なので、それで正常動作するといっても意味ないですが・・・ そうではなくて、msvcr90d.dllを入れると Win2000 なら正常に動作するのに、WinXPでは正常にどうしてしないのか? また、どうすれば正常に動作させられるのかが知りたいのです。
- ctmogawa
- ベストアンサー率54% (6/11)
もしまだ行っていないようであれば、DependencyWalkerにで実行ファイルが必要としている関連ファイル(.dll等)を調べてはいかがでしょうか。
お礼
回答ありがとうございます。 DependencyWalkerですか? 知りませんでした。 早速ダウンロードして実行してみました。 いずれも不足するDLLはありませんでした。 VS2008のリリース版は、エラーもありませんが無反応です。 VS2008のデバッグ版は、DLLの不足はありませんが、 「Error: Side-by-Side 設定情報の"XXX.exe"にエラーが含まれています.このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。 (14001).」 と表示されます。 BCC版のリリース・デバッグとも、MSVCR90D.dllが無いだけで、正常動作します。 ということで、残念ながら問題解決はできていません。
- zwi
- ベストアンサー率56% (730/1282)
デバッグビルドしたプログラムは開発環境のないPCでは動作しません。 あとmsvcr90d.dllを配布することはライセンス上禁止されています。 と言うことでリリースビルドを行なって下さい。ビルドの構成マネージャから切り替えることが出来ます。
お礼
回答ありがとうございます。 リリースビルドを行なったところ、エラーすら出ずにまったく動きません。 泥沼にはまってしまいました。 なお、参考になるかわかりませんが、同一ソースをBCCでコンパイル・リンクするとデバッグ・リリースとも正常に動作します。 現在の状況を整理しますと以下のようになります。 コンパイラ | デバッグ リリース ーーーーーー+ーーーーーーーーーーーーーーーーー VS2008 | 73KB * 28KB 動作せず BCC | 95KB 正常動作 91KB 正常動作 *:VS2008の入ったXP,Win7、msvcr90d.dllの入ったWin2000 では正常動作、動かしたいWinXPのPCでは msvcr90d.dllを入れても、 「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」 のエラーが出るだけで実行できません。 >デバッグビルドしたプログラムは開発環境のないPCでは動作しません。 msvcr90d.dllの入ったWin2000 では正常動作しますけど・・・ >あとmsvcr90d.dllを配布することはライセンス上禁止されています。 知りませんでした。 配布する場合には、BCCでコンパイルした版にします。 ありがとうございます。 引き続き、 リリースモードで正常動作する実行ファイルの作り方 VS2008で作成した実行ファイルのVS2008がインストールしていないPCでの動かし方 について、回答お待ちしています。よろしくお願いします。
お礼
回答ありがとうございます。 教示いただいた「方法 : リリース ビルドをデバッグする」でデバックしてみましたところ、 デバッグ版ではちゃんと制御が来るのに、リリース版では、コールバック関数の case WM_INITDIALOG: に制御が来ることなく、プログラムが終了していることがわかりました。 お手上げです。 >デバッグ版で問題がなくてもリリース版で動かないバグはプロでもやりがちなバグなので、あって当たり前だと思って下さい。初期化漏れ、配列の範囲外、ポインタ操作ミスなどが原因となります。 もっと簡単なテストプログラムで原因を究明しないと駄目そうですね。 お付き合いくださり、ありがとうございました。