- PR -

Visual C++のEXEファイルを実行時にエラー(基本的なことだと思います)

1
投稿者投稿内容
未記入
会議室デビュー日: 2007/07/21
投稿数: 6
投稿日時: 2008-09-10 19:38
VB.NET でつくったWindowsアプリケーションのインストールを行う直前にC++でつくったEXEファイルを実行させたいのですが(.NET Frameworkがインストールされていない場合の処理をおこなうために)、次のようなエラーが出てしまいます。

「サイドバイサイドの構成が間違っています・・・アプリケーションイベントログを確認・・・」

というわけで、イベントビュアを確認すると

------------------------------------------------------------------------
ログの名前: Application
ソース: SideBySide
日付: 2008/09/10 19:13:08
イベント ID: 33
タスクのカテゴリ: なし
レベル: エラー
キーワード: クラシック
ユーザー: N/A
コンピュータ: PC40
説明:
"F:\\SetupStart.exe" のアクティブ化コンテキストの生成に失敗しました。 従属アセンブリ Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" が見つかりませんでした。 詳細な診断を行うには sxstrace.exe を実行してください。
イベント XML:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="SideBySide" />
<EventID Qualifiers="49409">33</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2008-09-10T10:13:08.000Z" />
<EventRecordID>31587</EventRecordID>
<Channel>Application</Channel>
<Computer>PC40</Computer>
<Security />
</System>
<EventData>
<Data>Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"</Data>

途中省略

</EventData>
</Event>

------------------------------------------------------------------------

普段はC++はほとんど使っていないので
大変困っています。
どなたかご教示おねがいいたします。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2008-09-10 21:23
VB.NET が .NET Framework を必要とするように C++ も一般的に CRT(C-Runtime) が必要です。
今回はインストーラのようですので静的リンクでよろしいかと。
具体的にはプロジェクトのプロパティの C++ → コード生成にランタイムライブラリというのがありますのでこれを「マルチスレッド」「マルチスレッド デバッグ」に変更して再ビルドを行ってください。プロジェクトが複数の場合は依存関係すべてでです。

状況によってはコードの修正も必要かもしれません。

[ メッセージ編集済み 編集者: ya 編集日時 2008-09-10 21:24 ]
未記入
会議室デビュー日: 2007/07/21
投稿数: 6
投稿日時: 2008-09-11 01:23
返信ありがとうございます。
早速、ご指示の通りプロジェクトのプロパティを設定しましたが同じエラーです。

Visual Studio 2008ではエラーですが
Visual Studio 2005、2003では無事実行されることが判明しましたが
原因は???です

ちなみに実行環境のOSはVistaです。

何卒ご教授おねがいいたします。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-09-11 07:22
引用:

未記入さんの書き込み (2008-09-11 01:23) より:
返信ありがとうございます。
早速、ご指示の通りプロジェクトのプロパティを設定しましたが同じエラーです。


DebugもReleaseもちゃんと設定されていますか?
エラーなどは出ていませんか?
他に一緒に使っているDLL等がVisual C++ 2008でビルドされていたりして、忘れていませんか?

なお、MFCやATLを使っている場合、それらについても「静的にリンクする」といったような設定にする必要があります。

引用:

Visual Studio 2008ではエラーですが
Visual Studio 2005、2003では無事実行されることが判明しましたが
原因は???です


Visual C++ 2005も同じSide by Sideの仕組みを使っています。
多分、ランタイムが予めインストールされているのではないでしょうか。
Visual C++ 2003はSide by Sideを使っていないのでランタイムがシステムフォルダか同じフォルダにあれば動きます。
未記入
会議室デビュー日: 2007/07/21
投稿数: 6
投稿日時: 2008-09-11 10:36
返信ありがとうございます。

そもそもC++を利用した理由は次のようなものでした。

「アプリケーションのインストールを行う直前に、.Net Frameworkがインストールされていない環境では、レジストリを読み込み、その値によって起動するプログラムを変えたい。」

そこで、C++のWin32プロジェクトを作成したわけです。
以前、Visual C++ 2003で同様なことを行った際は問題ありませんでした。
ところが今回 Visual C++ 2008ではエラーが発生してしまいます。

Net Frameworkがインストールされていない環境ではどのような方法で
前述のような処理を行えばよいのでしょうか?
Win32プロジェクトは利用できないのでしょうか?

とても基本的な質問で恐縮ですが、
何卒よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-09-11 11:19
VC++8.0(VS2005)から、MSVCRT(C の基本ライブラリ)が変わっています。
ご参考
C ランタイム ライブラリ<microsoft.com>(下の方)
配置方法の選択<microsoft.com>

yaさんの方法で、解決できます。コンパイラのオプションの「コマンドライン」を見て、「/MD」がなく、「/MT」がある、ことを確認してみてください。
(VC++8.0 で作ったものを XP で実行すると、同じエラーが出るはずです)
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2008-09-11 21:09
あくまで勘ですが私が示した設定を適用したあと、VS をいったん終了、obj 以下のファイル(中間ファイルとかもろもろ)を全部削除してからもう一度開いてビルドしてみてください。
未記入
会議室デビュー日: 2007/07/21
投稿数: 6
投稿日時: 2008-09-12 10:04
皆様からのご指導のおかげで、
無事、エラーが出ずに実行できるようになりました。
本当にありがとうございました。

感謝です!!
1

スキルアップ/キャリアアップ(JOB@IT)