はじめに (対象読者・この記事でわかること)

この記事は、Visual Studio 2019を使用してMFCアプリケーションを開発しているが、作成した実行ファイルを他のPCで実行する際にDLLが見つからないという問題に直面している開発者を対象としています。

この記事を読むことで、MFCアプリケーションと必要な再頒布可能DLLを同じディレクトリに配置する具体的な方法がわかります。また、どのDLLが必要なのかを特定する方法や、DLLの依存関係を確認するためのツールの使い方も学べます。これにより、アプリケーションの配布が容易になり、ユーザーにインストーラーなしでアプリケーションを提供できるようになります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Visual Studio 2019の基本的な操作
  • MFCアプリケーションの基本的な開発知識
  • Windowsアプリケーションの配布に関する基本的な知識
  • C++の基本的なビルドプロセスの理解

MFCアプリケーションとDLLの関係

MFC(Microsoft Foundation Class)ライブラリは、Windowsアプリケーション開発を支援するためのC++クラスライブラリです。Visual StudioでMFCアプリケーションをビルドすると、実行ファイル(.exe)だけでなく、そのアプリケーションが依存するDLLファイルも生成されます。

これらのDLLファイルは、アプリケーションの実行時に必要です。特に、Visual C++ Redistributableとして配布されるDLLは、MFCアプリケーションが正しく動作するために不可欠です。開発環境ではこれらのDLLがシステムにインストールされているため、問題なく動作しますが、ユーザーの環境ではDLLが不足している可能性があります。

DLLをアプリケーションと同ディレクトリに配置することで、インストーラーなしでアプリケーションを配布できます。これにより、ユーザーは複雑なインストール手順を踏まずにアプリケーションを実行できます。

具体的な手順や実装方法

ここでは、Visual Studio 2019で作成したMFCアプリケーションと必要なDLLを同じディレクトリに配置する具体的な手順を説明します。

ステップ1:MFCアプリケーションのビルド

まず、Visual Studio 2019でMFCアプリケーションをビルドします。

  1. Visual Studio 2019を起動し、MFCアプリケーションプロジェクトを開きます。
  2. メニューから「ビルド」→「ソリューションのビルド」を選択します。
  3. ビルドが成功すると、プロジェクトの「Debug」または「Release」フォルダに実行ファイル(.exe)が生成されます。

ステップ2:必要なDLLの特定

次に、アプリケーションが依存するDLLを特定します。ここでは、Dependency Walker(depends.exe)というツールを使用します。

  1. Dependency Walkerをダウンロードしてインストールします(Microsoftが提供する古いツールですが、まだ有効です)。
  2. 生成された実行ファイルをDependency Walkerで開きます。
  3. 「ファイル」→「開く」で実行ファイルを選択します。
  4. 左側のツリービューに依存しているDLLの一覧が表示されます。
  5. 赤いエラーマークがついているDLLは、見つからないDLLです。これらのDLLを配置する必要があります。

ステップ3:DLLのコピー

特定したDLLをアプリケーションと同じディレクトリにコピーします。

  1. Visual Studio 2019のインストールフォルダから、必要なDLLを探します。通常は以下のパスにあります: - C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Redist\MSVC\14.xx.xxxxx\x64(64ビットアプリの場合) - C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Redist\MSVC\14.xx.xxxxx\x86(32ビットアプリの場合)

(Enterpriseは使用しているエディションに応じて変更してください)

  1. 以下のDLLをコピーします: - mfc140u.dll - vcruntime140.dll - vcruntime140_1.dll - ucrtbase.dll

  2. これらのDLLを、ステップ1で生成した実行ファイルと同じディレクトリにコピーします。

ステップ4:アプリケーションの実行テスト

DLLを配置した後、アプリケーションが正常に動作するかテストします。

  1. DLLを配置したディレクトリで実行ファイルをダブルクリックします。
  2. アプリケーションが正常に起動し、機能が正しく動作することを確認します。
  3. 別のPC(Visual StudioやVisual C++ RedistributableがインストールされていないPC)でも同様にテストします。

ハマった点やエラー解決

DLL配置時に遭遇する可能性のある問題とその解決方法を以下に示します。

DLLが見つからないエラー

現象: アプリケーション起動時に「DLLが見つからない」というエラーが表示される。

原因: 必要なDLLが不足している、またはDLLのバージョンが互換性がない。

解決策: 1. Dependency Walkerで依存関係を再確認し、不足しているDLLがないかチェックします。 2. 正しいバージョンのDLLを使用していることを確認します。DLLのバージョンはプロパティで確認できます。 3. 64ビットアプリケーションに32ビットのDLLを配置していないか確認します。

バージョン不一致による問題

現象: アプリケーションは起動するが、特定の機能が動作しない。

原因: DLLのバージョンがアプリケーションで期待されているバージョンと異なる。

解決策: 1. Visual Studio 2019で使用されているVisual C++ Redistributableのバージョンを確認します。 2. そのバージョンに対応するDLLを使用します。 3. 必要に応じて、アプリケーションがサポートするDLLのバージョンを明示的に指定します。

依存関係の複雑さ

現象: DLLの依存関係が複雑で、どのDLLを配置すればよいか判断できない。

解決策: 1. Dependency Walkerだけでなく、Process Monitorのようなツールを使用して、実行時にアクセスされるDLLを監視します。 2. アプリケーションが使用しているWindows APIのドキュメントを確認し、必要なDLLを特定します。 3. マニフェストファイル(.manifest)を確認し、必要なDLLバージョンが記述されているかチェックします。

解決策

上記の問題を解決するための具体的な手順は以下の通りです。

  1. 正しいDLLの特定: - Dependency Walkerを使用して、アプリケーションが依存するDLLを完全にリストアップします。 - マニフェストファイル(.manifest)を確認し、必要なDLLバージョンを特定します。

  2. DLLのバージョン管理: - アプリケーションと同じバージョンのDLLを使用します。 - Visual Studio 2019で使用されているVisual C++ Redistributableのバージョンを確認し、そのバージョンのDLLを使用します。

  3. 依存関係の解決: - DLLの依存関係を再帰的に確認し、すべての必要なDLLを配置します。 - 特定のDLLがシステムに依存している場合は、そのDLLを配置する代わりに、システム要件として提示します。

  4. テストの徹底: - 開発環境だけでなく、クリーンな環境(Visual StudioやVisual C++ RedistributableがインストールされていないPC)でもテストします。 - 異なるバージョンのWindowsでテストし、互換性を確認します。

まとめ

本記事では、Visual Studio 2019で作成したMFCアプリケーションと必要なDLLを同じディレクトリに配置する方法について解説しました。

  • DLLの特定方法: Dependency Walkerを使用してアプリケーションが依存するDLLを特定する方法
  • DLLの配置方法: 必要なDLLをアプリケーションと同ディレクトリにコピーする手順
  • 問題解決: DLLが見つからないエラーやバージョン不一致問題の解決策

この記事を通して、DLLを正しく配置することで、インストーラーなしでMFCアプリケーションを配布する方法が理解できたと思います。これにより、ユーザーにとって使いやすいアプリケーションを提供できるようになります。

今後は、DLLの依存関係を自動で解決するツールの使用方法や、より高度なアプリケーション配布方法についても記事にする予定です。

参考資料