サイドバイサイド開発について

[戻る]
え〜いち 2008/10/02(木) 13:36:32
最近、VC++6.0からVC++8.0に乗り換えました
製品を開発したのですが、WinXp上では再配布可能なランタイムを入れることで動作して
いるのですが、VistaではPCによって以下のようなパターンの動作をしてしまいます

1.起動すると「サイドバイサイドの構成が間違っています・・・」のエラーメッセージ
を表示

2.起動すると毎回「○○.exeは動作を停止しました」のエラーメッセージを表示

3.起動すると毎回ではないが「○○.exeは動作を停止しました」のエラーメッセージを表示

4.問題なく動作する(ただし、まだ、耐久等の完璧な評価は行えておりませんので、動
作するように見えるというべきかもしれません)

です
不具合があって上記の状態かもしれませんが、サイドバイサイド開発を理解できていない
こともあると持っており、切り分けがしたいと考えています

で、質問ですが

1.サイドバイサイドについてわかりやすく説明しているサイト、書籍はありませんか?
ばぐぜんとした質問ですいませんが、ネットで調べていてもなかなか情報がまとめられません

2.サイドバイサイドの問題の場合には、必ず上記の1のように「サイドバイサイドの構
成が間違っています・・・」のメッセージボックスが表示されますか?それとも上記の2
や3の状態になりますか?
例えば、マニフェストに記載したバージョンが見つからない場合に、System32/環境変数
で検索できる場所にDLLが見つかった場合には、ロードしてしまって、誤ったバージョン
のために上記2のようになりますか?

仲澤@失業者 2008/10/02(木) 16:47:27
本件には、あまり詳しくないのですが、
「サイドバイサイド」とは、要はビルドしたときの
バージョンのアセンブリ(Com DLL等)を起動時に使用し、
アップグレードされたアセンブリを使用しないという方法
のことを言うようです。.Net Frameworkなんかがやってくれる
ようです。

この現象が発生する原因として考えられるのは
インストーラプロジェクトの構成が間違っているか足りない
ものがある。というのが考えられます。

ただ、VC6からの乗換えなので .Netは使わないとも思いますし、
MFCのランタイムの不整合場合のエラーメッセージは、単に
「このアプリケーションの構成が・・・実行できませんでした」
だったような気もするので、的を外しているかもしれません。

bun 2008/10/03(金) 09:25:42
ランタイムはMFCのことですか?

だとしたら、取るべき手段は2つ。
1.インストーラプロジェクトにMFCのマージモジュールを含める
2.MFCを動的リンクからスタティックリンクに切り換える

私もVC++6.0から2005に乗り換えた者ですが、
最初は1.で行こうとして、ずっと使ってきたインストーラがマージモジュールに対応
していないことを知り、なんとかしようとしましたが挫折。
次にWindowsインストーラに乗り換えようとしましたが、これも挫折。
結局、MFCをスタティックリンクに切り換えた経緯があります。

PCによって動作が変わるのは、おそらくマージモジュールをインストール済みのPCとそ
うでないPCが混在しているからでしょう。

え〜いち 2008/10/03(金) 10:35:36
仲澤@失業者さま

回答ありがとうございます
>MFCのランタイムの不整合場合のエラーメッセージは、単に
>「このアプリケーションの構成が・・・実行できませんでした」
>だったような気もするので、的を外しているかもしれません。

私の予想なのですが、このエラーメッセージは、マニフェストに従って
winsxsフォルダ以下→Ssytem32フォルダ以下→環境変数指定フォルダ以下の順番にDLLを探
して見つからない場合に表示される

が、winsxsフォルダ以下には見つからないものの、それ以外に検索にいったフォルダに同
名のDLLが見つかるもバージョンが異なる場合に、落ちることがある

ではないかと思ってきました

え〜いち 2008/10/03(金) 10:40:30
Bunさま

>ランタイムはMFCのことですか?

これもわかりかねております
VC++8.0でMFCのプロジェクトを作成するとMFCとCのランタイムがマニフェストに記載されます
これだけを考慮すればいいのか?も自信がありません

逆に言うと、MFCのプロジェクトでビルドしたアプリケーションを動作させるためには、
何をすればいいか?混乱しております

>1.インストーラプロジェクトにMFCのマージモジュールを含める

この場合、モジュールはどこにおけばいいでしょう?
実行ファイルとどうフォルダ?それともSystem32?あるいは、WinSXS?でしょうか?

>2.MFCを動的リンクからスタティックリンクに切り換える

MFCのランタイムだけの問題であればこれでもいいかもしれません
システムが巨大なので、直すのは大変&サイズが大きくなりそうですが・・・

え〜いち 2008/10/03(金) 10:41:33
Bunさま

すいません。回答のお礼が抜けていました
わざわざ回答いただいたのにもうしわけございませんでした

え〜いち 2008/10/03(金) 11:27:57
サイドバイサイドについての調査が行き詰まったので、今までのことを整理して以下のよ
うに開発をすればいいのではないかと思えてきました

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再頒布可能パッケージ
をインストールする

新規の開発においてはこれで良さそうですね
ただし、過去の資産がある場合もうちょっと考える必要がありますね

bun 2008/10/03(金) 13:16:39
それで間違いないです。

私の場合は、
> ンをインストールする場合には、Microsoft Visual C++ 2005 SP1再頒布可能
> パッケージをインストールする
が飲み込めずにあきらめました。
だって、自分のアプリケーションのインストーラより、そっちの方が重いんです。
ちょっと、それに耐えかねたわけです。

ちなみに、Microsoft Visual C++ 2005 SP1再頒布可能パッケージは複数のライブ
ラリの集合体なので重いわけです。
マージモジュールというものを使えば、自アプリに必要なライブラリだけがインス
トールされ、そのライブラリを使用するために必要な設定が行われます。

アプリケーションのマニフェストファイルにはライブラリの名前やバージョン等
が記載されているだけです。
マージモジュールやMicrosoft Visual C++ 2005 SP1再頒布可能パッケージをイ
ンストールすると、ライブラリがインストールされると同時に、ライブラリの
名前やバージョンとの関連づけが行われます。
Active-Xの仕組みをご存じでしたら、あれに近いイメージです。

そのため、マニフェストだけだと、ライブラリの名前やバージョンから対応する
ライブラリを探しても見つからず、以下のメッセージとなります。
「サイドバイサイドの構成が間違っています・・・」
※ MicroSoft推奨ではマニフェストとマージモジュールは同時インストールだ
   から同時インストールされたはずなのに見つからないのはおかしいという
   ことで、このようなメッセージなのでしょう

lng 2008/10/07(火) 11:42:35
ご存知かもしれませんが、パッケージのインストールや
マージモジュールの使用以外にマニフェストとDLLをexeと
同じところに置く方法もありますね。
これだとモジュールがインストールしてあるかなど確認しなくて
よいので手間を省きたいときは便利かなと思います。

http://msdn.microsoft.com/ja-jp/library/ms235291(VS.80).aspx

古いスレッドには追加発言できません。