71110


VisualStudio2019で作成したMFCアプリを、ユーザーに配布する場合、ユーザー側にはVisualStudioがインストールされていないので再頒布可能パッケージをインストールする必要があると思います。

私のMFCアプリは、32bitのアプリ(A)から、OS環境を判断して、32bitOSなら32bitアプリ(B)、64bitOSなら64bitアプリ(C)を呼び出しています。

このアプリ、A,B,Cは同じディレクトリに存在しています。

ユーザーにインストールさせるのではなく、再頒布可能DLL（再頒布パッケージをインストールすると置かれるDLL）をアプリと同じ場所に置こうと思うのですが、同名のDLLで32bitと64bit用のDLLがあり、どのように配置し、どのように設定していいかわかりません。どなたか、解決策を知っているのあれば教えて下さい。


CC BY-SA 4.0
2020-10-10T16:55:20.623
71083
2020-10-11T16:16:42.600
2020-10-10T17:20:18.320
31497
31497
question
c++ windows visual-studio
VisualStudio2019で作成してMFCアプリと同ディレクトリに再頒布DLLを置く場合


私自身はコメントしたように「その要望自体を止めた方が良い」という意見ですが、顧客要望/業務命令とかでそうも言っていられない場合もあるでしょうから、思考実験として。

意見の基は @774RR さんコメントのような情報や、「[Visual C++
ファイルの再配布](https://docs.microsoft.com/ja-jp/cpp/windows/redistributing-visual-
cpp-files?view=vs-2019) の
[個々の再頒布可能ファイルをインストールする](https://docs.microsoft.com/ja-
jp/cpp/windows/redistributing-visual-cpp-files?view=vs-2019#install-
individual-redistributable-files)
に出来ますとはありますが、`サービス上の理由から、このインストール場所は使用しないことをお勧めします。`」とも書かれている内容などです。

* * *

  * 一番作業量が少ないのは @sayuri さんのコメントのように、32bitプログラムだけを動作させることでしょう。  
64bitWindowsであってもWOW64の仕組みで32bitプログラムは動作します。  
プログラムやデータのメンテナンス等も1つで済ませられるでしょう。

  * 類似の考え方で、64bitWindowsでは64bitアプリケーションを使いたいなら、それぞれのbit数に対応するプログラムだけを作成・インストール・動作させることでしょう。

上記いずれでも、bit数を判断して切り替えるプログラムは不要になります。

* * *

32bit/64bit両方を作成してインストールし、別プログラムで判断して切り替える方式を変えたくない場合は、何も変えずに全てを単一のディレクトリに配置することはできません。

何かを変える必要がありますが、上記の次に作業量が少ないのは32bit/64bit毎にディレクトリを分けることだと思われます。

  * 並列に32bit:`x86`と64bit:`x64`のようにディレクトリを作成して分ける  
あるいは初期のメインのディレクトリを32bitで使用し、その下に64bit用ディレクトリを作成して分ける

  * 起動用アプリケーション A からそれぞれのアプリケーション B,C がある場所をカレントディレクトリとして起動する
  * DLL以外のbit数にかかわらず共通な設定・構成・オプション等のデータファイルへのアクセスは、カレントディレクトリを基点とするのではなく、設定用やデータ用ディレクトリという変数や情報を作って、そこを基点にしてアクセスする

* * *

「MFCアプリと同ディレクトリに再頒布DLLを置く」という要望には合っていないですが、もう一つの方法として以下が考えられます。

  * アプリケーション A,B,C は同じディレクトリに置く
  * 再頒布DLLはその下に並列に32bit:`x86`と64bit:`x64`のようにディレクトリを作成して分ける
  * 起動用アプリケーションA で B,C を起動する前に、環境変数の`PATH`に対応するbit数の再頒布DLLディレクトリを追加してから B,C を起動する

一応こんな記事の内容にも注意しておいてください。  
[DLL の植え付けの脆弱性のトリアージ](https://msrc-blog.microsoft.com/2018/04/10/triaging-a-
dll-planting-vulnerability-2/)


CC BY-SA 4.0
2020-10-11T03:41:59.090
71091
2020-10-11T03:41:59.090
26370
71083
answer


> 再配布DLLの組み込みとは具体的にどのような方法でしょうか。教えていただけないでしょうか？

作成方法ですが、プロジェクトのプロパティページを開いて、「構成プロパティ」－「詳細」で表示される設定値の「詳細プロパティ」内にある「MFCの使用」と言う項目を「スタティックライブラリでMFCを使用する」に設定してビルドしてやることにより、MFCのライブラリを含めて、全て実行に必要なものが実行ファイル(*.exe)の中に埋め込めます。

[![画像の説明をここに入力](https://i.stack.imgur.com/4Dr5U.png)](https://i.stack.imgur.com/4Dr5U.png)

ですので、再配布用のDLLをインストールせずとも実行ファイル単体で動作させることができるようになります。

この方法であればアプリを実行する端末には作成した32bitと64bitの実行ファイル(*.exe)のみ配置するだけで動作が可能です。あとはOS判別の実行ファイルからそれぞれの実行ファイルをキックしてやればお望みの動作となると思います。

ただし、コメントでも触れましたが、exeのサイズはかなり肥大しますし(ダイアログを表示するだけの実行ファイルでも2MBとかになります)、OSのセキュリティアップデート等の恩恵は受けることができなくなります。


CC BY-SA 4.0
2020-10-11T16:16:42.600
71110
2020-10-11T16:16:42.600
9515
71083
answer