最近、VC++6.0からVC++8.0に乗り換えました
製品を開発したのですが、WinXp上では再配布可能なランタイムを入れることで動作して
いるのですが、VistaではPCによって以下のようなパターンの動作をしてしまいます
1.起動すると「サイドバイサイドの構成が間違っています・・・」のエラーメッセージ
を表示
2.起動すると毎回「○○.exeは動作を停止しました」のエラーメッセージを表示
3.起動すると毎回ではないが「○○.exeは動作を停止しました」のエラーメッセージを表示
4.問題なく動作する(ただし、まだ、耐久等の完璧な評価は行えておりませんので、動
作するように見えるというべきかもしれません)
です
不具合があって上記の状態かもしれませんが、サイドバイサイド開発を理解できていない
こともあると持っており、切り分けがしたいと考えています
で、質問ですが
1.サイドバイサイドについてわかりやすく説明しているサイト、書籍はありませんか?
ばぐぜんとした質問ですいませんが、ネットで調べていてもなかなか情報がまとめられません
2.サイドバイサイドの問題の場合には、必ず上記の1のように「サイドバイサイドの構
成が間違っています・・・」のメッセージボックスが表示されますか?それとも上記の2
や3の状態になりますか?
例えば、マニフェストに記載したバージョンが見つからない場合に、System32/環境変数
で検索できる場所にDLLが見つかった場合には、ロードしてしまって、誤ったバージョン
のために上記2のようになりますか?
本件には、あまり詳しくないのですが、
「サイドバイサイド」とは、要はビルドしたときの
バージョンのアセンブリ(Com DLL等)を起動時に使用し、
アップグレードされたアセンブリを使用しないという方法
のことを言うようです。.Net Frameworkなんかがやってくれる
ようです。
この現象が発生する原因として考えられるのは
インストーラプロジェクトの構成が間違っているか足りない
ものがある。というのが考えられます。
ただ、VC6からの乗換えなので .Netは使わないとも思いますし、
MFCのランタイムの不整合場合のエラーメッセージは、単に
「このアプリケーションの構成が・・・実行できませんでした」
だったような気もするので、的を外しているかもしれません。
ランタイムはMFCのことですか?
だとしたら、取るべき手段は2つ。
1.インストーラプロジェクトにMFCのマージモジュールを含める
2.MFCを動的リンクからスタティックリンクに切り換える
私もVC++6.0から2005に乗り換えた者ですが、
最初は1.で行こうとして、ずっと使ってきたインストーラがマージモジュールに対応
していないことを知り、なんとかしようとしましたが挫折。
次にWindowsインストーラに乗り換えようとしましたが、これも挫折。
結局、MFCをスタティックリンクに切り換えた経緯があります。
PCによって動作が変わるのは、おそらくマージモジュールをインストール済みのPCとそ
うでないPCが混在しているからでしょう。
仲澤@失業者さま
回答ありがとうございます
>MFCのランタイムの不整合場合のエラーメッセージは、単に
>「このアプリケーションの構成が・・・実行できませんでした」
>だったような気もするので、的を外しているかもしれません。
私の予想なのですが、このエラーメッセージは、マニフェストに従って
winsxsフォルダ以下→Ssytem32フォルダ以下→環境変数指定フォルダ以下の順番にDLLを探
して見つからない場合に表示される
が、winsxsフォルダ以下には見つからないものの、それ以外に検索にいったフォルダに同
名のDLLが見つかるもバージョンが異なる場合に、落ちることがある
ではないかと思ってきました
Bunさま
>ランタイムはMFCのことですか?
これもわかりかねております
VC++8.0でMFCのプロジェクトを作成するとMFCとCのランタイムがマニフェストに記載されます
これだけを考慮すればいいのか?も自信がありません
逆に言うと、MFCのプロジェクトでビルドしたアプリケーションを動作させるためには、
何をすればいいか?混乱しております
>1.インストーラプロジェクトにMFCのマージモジュールを含める
この場合、モジュールはどこにおけばいいでしょう?
実行ファイルとどうフォルダ?それともSystem32?あるいは、WinSXS?でしょうか?
>2.MFCを動的リンクからスタティックリンクに切り換える
MFCのランタイムだけの問題であればこれでもいいかもしれません
システムが巨大なので、直すのは大変&サイズが大きくなりそうですが・・・
Bunさま
すいません。回答のお礼が抜けていました
わざわざ回答いただいたのにもうしわけございませんでした
サイドバイサイドについての調査が行き詰まったので、今までのことを整理して以下のよ
うに開発をすればいいのではないかと思えてきました
VC++8.0にはSP1がある
Microsoft Visual C++ 2005 再頒布可能パッケージにも、SP1がある
そして、SP1が上位互換を取っているわけではない
このことから、VC++8.0SP1で開発をするとデフォルトで、Microsoft Visual C++ 2005
SP1再頒布可能パッケージでインストールして、WinSxSにおかれるランタイムを参照する
ようにマニフェストが記載される
よって、サイドバイサイドを特に意識しなくても、VC++8.0SP1で開発したアプリケーショ
ンをインストールする場合には、Microsoft Visual C++ 2005 SP1再頒布可能パッケージ
をインストールする
新規の開発においてはこれで良さそうですね
ただし、過去の資産がある場合もうちょっと考える必要がありますね
それで間違いないです。
私の場合は、
> ンをインストールする場合には、Microsoft Visual C++ 2005 SP1再頒布可能
> パッケージをインストールする
が飲み込めずにあきらめました。
だって、自分のアプリケーションのインストーラより、そっちの方が重いんです。
ちょっと、それに耐えかねたわけです。
ちなみに、Microsoft Visual C++ 2005 SP1再頒布可能パッケージは複数のライブ
ラリの集合体なので重いわけです。
マージモジュールというものを使えば、自アプリに必要なライブラリだけがインス
トールされ、そのライブラリを使用するために必要な設定が行われます。
アプリケーションのマニフェストファイルにはライブラリの名前やバージョン等
が記載されているだけです。
マージモジュールやMicrosoft Visual C++ 2005 SP1再頒布可能パッケージをイ
ンストールすると、ライブラリがインストールされると同時に、ライブラリの
名前やバージョンとの関連づけが行われます。
Active-Xの仕組みをご存じでしたら、あれに近いイメージです。
そのため、マニフェストだけだと、ライブラリの名前やバージョンから対応する
ライブラリを探しても見つからず、以下のメッセージとなります。
「サイドバイサイドの構成が間違っています・・・」
※ MicroSoft推奨ではマニフェストとマージモジュールは同時インストールだ
から同時インストールされたはずなのに見つからないのはおかしいという
ことで、このようなメッセージなのでしょう
ご存知かもしれませんが、パッケージのインストールや
マージモジュールの使用以外にマニフェストとDLLをexeと
同じところに置く方法もありますね。
これだとモジュールがインストールしてあるかなど確認しなくて
よいので手間を省きたいときは便利かなと思います。
http://msdn.microsoft.com/ja-jp/library/ms235291(VS.80).aspx