Visual Studio c ++ V10を使用して、DLLを構築し、DLLの名前の競合を解決する方法を理解しようとしています。詳細はこちらです。
S社は。という製品を出荷していますM.EXE。M.EXEにインストールされていると仮定し\S\BIN\M.EXEます。会社SU.DLLは、にインストールされている、 というDLLに静的にリンクしています\S\BIN\U.DLL。 オープンソースコードが含まれており、wcharをネイティブ型として認識しないU.DLLVisualC++コンパイラオプションを使用して構築されています。/Zc:wchar_t-
C社はと呼ばれるDLLO.DLLを出荷し、このDLLのAPIを公開し、のインポートライブラリを出荷しO.DLLます。O.DLLにインストールされていると仮定し\C\BIN\O.DLLます。 にインストールされている、O.DLLというDLLに静的にリンクします。 は同じオープンソースコードに基づいて構築されていますが、ネイティブタイプとして認識されるVisualC++コンパイラオプションを使用して構築されています。U.DLL\C\BIN\U.DLLU.DLL/Zc:wchar_twchar_t
理想的には、C社とS社U.DLLは同じVisual C ++オプションを使用してビルドすることに同意しますが、それは不可能です。
M.EXES社からは拡張可能であり、アンマネージC ++で独自のDLLを構築できます。これを呼び出すとNODE.DLL、M.EXEすべてが正しくセットアップされた場合に呼び出されます。C社からNODE.DLL静的にリンクするようにビルドしたいのですが、問題は、一度実行すると、からライブラリがロードされ、からのシンボルが、それぞれによってどのようにビルドされたかにより、のシンボルとわずかに異なることです。会社。したがって、ロードしようとすると失敗します。これは、をロードするときに、必要なシンボルが存在しないためです。これは、Windowsがすでにロードされていると見なすためです。O.DLLM.EXEU.DLL\S\BIN\S\BIN\U.DLL\C\BIN\U.DLLU.DLLM.EXENODE.DLLNODE.DLLO.DLLU.DLL\C\BIN\U.DLLU.DLL
状況の図は次のとおりです。
M.EXE static link to -> \S\BIN\U.DLL
M.EXE dynamic link to -> NODE.DLL
NODE.DLL static link to O.DLL
O.DLL static link to \C\BIN\U.DLL
事実上、私はとの両方が同じプロセススペースに共存する必要があり、\S\BIN\U.DLLその\C\BIN\U.DLLバージョンM.EXEのを使用し、そのバージョンのU.DLLをO.DLL使用していU.DLLます。
M.EXE再構築したりO.DLL、それぞれの読み込み方法を変更したりするオプションがないことに注意してくださいU.DLL。それらはサードパーティからのものであるため、静的リンクを変更することはできません。また、インポートライブラリが提供されているC ++ライブラリであるため、LoadLibraryonを使用するオプションもありません。O.DLL
マニフェストを使用してNODE.DLL、O.DLLに静的にリンクされたビルドを作成するときに、のマニフェストに設定して、にインストールされている独自のコピーNODE.DLLをロードできると思います。私はこれを行う方法を理解することができません。理想的には、のマニフェストを変更したくないのですが、それが唯一の解決策である場合は、それを使用します。O.DLLU.DLL\C\BIN\U.DLLO.DLL