Visual Studio c ++ V10を使用して、DLLを構築し、DLLの名前の競合を解決する方法を理解しようとしています。詳細はこちらです。
S社は。という製品を出荷していますM.EXE
。M.EXE
にインストールされていると仮定し\S\BIN\M.EXE
ます。会社SU.DLL
は、にインストールされている、 というDLLに静的にリンクしています\S\BIN\U.DLL
。 オープンソースコードが含まれており、wcharをネイティブ型として認識しないU.DLL
VisualC++コンパイラオプションを使用して構築されています。/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.DLL
U.DLL
/Zc:wchar_t
wchar_t
理想的には、C社とS社U.DLL
は同じVisual C ++オプションを使用してビルドすることに同意しますが、それは不可能です。
M.EXE
S社からは拡張可能であり、アンマネージC ++で独自のDLLを構築できます。これを呼び出すとNODE.DLL
、M.EXE
すべてが正しくセットアップされた場合に呼び出されます。C社からNODE.DLL
静的にリンクするようにビルドしたいのですが、問題は、一度実行すると、からライブラリがロードされ、からのシンボルが、それぞれによってどのようにビルドされたかにより、のシンボルとわずかに異なることです。会社。したがって、ロードしようとすると失敗します。これは、をロードするときに、必要なシンボルが存在しないためです。これは、Windowsがすでにロードされていると見なすためです。O.DLL
M.EXE
U.DLL
\S\BIN
\S\BIN\U.DLL
\C\BIN\U.DLL
U.DLL
M.EXE
NODE.DLL
NODE.DLL
O.DLL
U.DLL
\C\BIN\U.DLL
U.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 ++ライブラリであるため、LoadLibrary
onを使用するオプションもありません。O.DLL
マニフェストを使用してNODE.DLL
、O.DLLに静的にリンクされたビルドを作成するときに、のマニフェストに設定して、にインストールされている独自のコピーNODE.DLL
をロードできると思います。私はこれを行う方法を理解することができません。理想的には、のマニフェストを変更したくないのですが、それが唯一の解決策である場合は、それを使用します。O.DLL
U.DLL
\C\BIN\U.DLL
O.DLL