重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Visual Studio 2008 の C++(C++ではなくC)で作成した実行ファイルを、Visual Studio 2008 がインストールされていないが別のPC(WinXP)で実行すると、
「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」
のエラーが出るだけで実行できません。
同様な内容のQ&Aも見ましたが、解決できないので質問します。

なお、参考になるかわかりませんが、
・Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ
 vcredist_x86.exe
はインストールしてあります。

・同じVisualStudio2008のC#で作成した実行ファイルは、正常に動きます。

・別のPC(Win2000)では、 msvcr90d.dll を C:\WINNT\system32 フォルダに入れると、正常に動きます。

よろしくお願いいたします。

A 回答 (8件)

>>単にバグを内包していてリリース版で問題が表面化しているだけの気がしますが。


>違う気がします。

VS2008から起動しても何も表示されずすぐ終了するなら十分バグです。
デバッグ版で問題がなくてもリリース版で動かないバグはプロでもやりがちなバグなので、あって当たり前だと思って下さい。初期化漏れ、配列の範囲外、ポインタ操作ミスなどが原因となります。
VS2008でデバッガが反応しないのであれば、意図した通りには動いてませんがプログラムはOSから見る限り正常に動いていると判断できます。
なので、こういう場合はウィンドウアプリならプログラムのあちこちに通過点をチェックするOutputDebugString()を埋め込むなどしてプログラムの何処を通ったか確認する必要があります。コンソールアプリならprintf()をあちこちに埋め込んで下さい。

あるいは下記の様にしてブレークポイントやステップ実行で終了指定してしまうポイントを見つけて下さい。
「方法 : リリース ビルドをデバッグする」
http://msdn.microsoft.com/ja-jp/library/fsk896zz …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

教示いただいた「方法 : リリース ビルドをデバッグする」でデバックしてみましたところ、
デバッグ版ではちゃんと制御が来るのに、リリース版では、コールバック関数の
case WM_INITDIALOG:
に制御が来ることなく、プログラムが終了していることがわかりました。

お手上げです。

>デバッグ版で問題がなくてもリリース版で動かないバグはプロでもやりがちなバグなので、あって当たり前だと思って下さい。初期化漏れ、配列の範囲外、ポインタ操作ミスなどが原因となります。

もっと簡単なテストプログラムで原因を究明しないと駄目そうですね。
お付き合いくださり、ありがとうございました。

お礼日時:2012/05/03 20:56

そのダイアログリソースに何が付いています?


と確認したつもりなのですが……

ダイアログにツリービューやリストビューがあった場合に、InitCommonControlsEx()などで初期化しないとダイアログ生成に失敗する。
という動作をすることがありますが。

>switch (msg) {
にブレークポイントを設定して、まず、どんなメッセージが来ているのか…というのを確認する。
なんてのもアリかも知れませんが。

>DialogBox(hInstance, "IDD_DLGMAIN", NULL, (DLGPROC)DlgProc);
の戻り値を確認する。とかもありでしょうかね。
    • good
    • 0
この回答へのお礼

再度の回答ありがとうございます。

DialogBox(hInstance, "IDD_DLGMAIN", NULL, (DLGPROC)DlgProc);
の戻り値を確認したところ、デバッグモードでは1、リリースモードでは-1でした。

ということで、デバッグモードとリリースモードの違いをいろいろ調べたところ、何と
構成プロパティ - 全般 - 文字セット が
デバッグモードでは、
 マルチバイト文字セットを使用する
リリースモードでは、
 UNICODE文字セットを使用する
になっていました。これをデバッグモードと同じ設定にしたところ、あっさり正常動作するようになり、しかもリリースビルドした実行ファイルは、別のPC(vcredist_x86.exeをインストールしたWinXP)で正常に動作するようになりました。

ありがとうございました

お礼日時:2012/05/05 08:35

>リリース版では、コールバック関数の


>case WM_INITDIALOG:
>に制御が来ることなく、プログラムが終了していることがわかりました。

そのダイアログにつけているリソース(コモンコントロール)はどんなのがあります?
InitCommonControlsEx()とかの初期化を実施していなかったためWM_INITDIALOGまで進まない。
なんて事態に遭遇したことはありますけど……。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>そのダイアログにつけているリソース(コモンコントロール)はどんなのがあります?

ダイアログは、コールバック関数を 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);

で処理を行っています。ダイアログが生成された初期にタイトルバーを表示するはずですが、ここに制御が来ないのです。

お礼日時:2012/05/04 01:19

情報が小出しにされているので全体的な状況がいまいちつかめておりません。



>VS2008のリリース版はエラーもありませんが無反応です。
こちらもSide-by-Side エラーだと思っていました。一応実行出来ているものと思われます。
この件に関しては開発PC上でVS2008からリリース版をF5実行した場合も同じでしょうか?
単にバグを内包していてリリース版で問題が表面化しているだけの気がしますが。
つまり、デバッグ版とは別件の問題です。
    • good
    • 0
この回答へのお礼

zwi様、何度も回答ありがとうございます。

>こちらもSide-by-Side エラーだと思っていました。一応実行出来ているものと思われます。
VS2008のリリース版は、DependencyWalkerでは、Side-by-Side エラーは検出されていません。
まったく実行されません。つまり、正常ならばウインドウが開いて入力待ちになるのですが、起動しても何も表示されず、エラーもなく、すぐ正常終了(?)してしまうのです。

>この件に関しては開発PC上でVS2008からリリース版をF5実行した場合も同じでしょうか?
同じです。まったく何も表示されず、すぐ終了します。F5を押しても、Releaseフォルダ内のEXEファイルをダブルクリックしても同じです。

>単にバグを内包していてリリース版で問題が表面化しているだけの気がしますが。
違う気がします。

>情報が小出しにされているので全体的な状況がいまいちつかめておりません。
どこに問題があるかわからない状態なので、適切な情報を報告できず、すいません。

お礼日時:2012/05/03 19:00

msvcr90d.dll自体が開発環境の一部なんですが・・・。


たぶん、その他のdllに問題があるんだと思います。

他の方が言われるようにDependencyWalkerで調べるか、イベントログに詳細なエラーが出ていると思うので調べて貼り付けて下さい。
    • good
    • 0
この回答へのお礼

再度回答ありがとうございます。
No2さんへのお礼に記載したとおり、不足するDLLはありません。

以下は、正常動作しないWinXPでDependencyWalkerを実行した結果です。

VS2008のリリース版は、エラーもありませんが無反応です。
VS2008のデバッグ版は、DLLの不足はありませんが、
「Error: Side-by-Side 設定情報の"XXX.exe"にエラーが含まれています.このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。 (14001).」
と表示されます。

お礼日時:2012/05/03 13:03

>>デバッグビルドしたプログラムは開発環境のないPCでは動作しません。


>msvcr90d.dllの入ったWin2000 では正常動作しますけど・・・

それは開発環境にしかない存在しないはずのDLLをWindows2000にいれてる状態(プログラムを実行させる分には開発環境と同じ状態)なので、それで正常動作するといっても意味ないですが・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>それは開発環境にしかない存在しないはずのDLLをWindows2000にいれてる状態(プログラムを実行させる分には開発環境と同じ状態)なので、それで正常動作するといっても意味ないですが・・・

そうではなくて、msvcr90d.dllを入れると Win2000 なら正常に動作するのに、WinXPでは正常にどうしてしないのか? また、どうすれば正常に動作させられるのかが知りたいのです。

お礼日時:2012/05/03 12:56

もしまだ行っていないようであれば、DependencyWalkerにで実行ファイルが必要としている関連ファイル(.dll等)を調べてはいかがでしょうか。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
DependencyWalkerですか? 知りませんでした。
早速ダウンロードして実行してみました。

いずれも不足するDLLはありませんでした。
VS2008のリリース版は、エラーもありませんが無反応です。
VS2008のデバッグ版は、DLLの不足はありませんが、
「Error: Side-by-Side 設定情報の"XXX.exe"にエラーが含まれています.このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。 (14001).」
と表示されます。

BCC版のリリース・デバッグとも、MSVCR90D.dllが無いだけで、正常動作します。

ということで、残念ながら問題解決はできていません。

お礼日時:2012/05/03 12:53

デバッグビルドしたプログラムは開発環境のないPCでは動作しません。


あとmsvcr90d.dllを配布することはライセンス上禁止されています。
と言うことでリリースビルドを行なって下さい。ビルドの構成マネージャから切り替えることが出来ます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

リリースビルドを行なったところ、エラーすら出ずにまったく動きません。
泥沼にはまってしまいました。

なお、参考になるかわかりませんが、同一ソースを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での動かし方
について、回答お待ちしています。よろしくお願いします。

お礼日時:2012/05/03 09:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!