使用Visual Studio c++ V10,我正在尝试构建DLL并解决DLL命名冲突。以下是详细信息。
公司S提供名为
公司C提供名为
理想情况下,公司C和公司S将同意使用相同的Visual C ++选项构建
来自公司S的
情况的示意图如下:
有效地,我需要
请注意,我无法重新构建
我相信可以使用清单文件,这样当我构建静态链接到O.DLL的
公司S提供名为
M.EXE
的产品。假设M.EXE
安装在\S\BIN\M.EXE
中。公司S静态链接到名为U.DLL
的DLL,该DLL安装在\S\BIN\U.DLL
中。U.DLL
包含开源代码,并使用了Visual C ++编译器选项/Zc:wchar_t-
构建,该选项不认识wchar作为本机类型。公司C提供名为
O.DLL
的DLL,并发布此DLL的API,并提供O.DLL
的导入库。假设O.DLL
安装在\C\BIN\O.DLL
中。O.DLL
静态链接到名为U.DLL
的DLL,该DLL安装在\C\BIN\U.DLL
中。U.DLL
构建于相同的开源代码上,但是使用了Visual C ++编译器选项/Zc:wchar_t
,该选项将wchar_t
识别为本机类型。理想情况下,公司C和公司S将同意使用相同的Visual C ++选项构建
U.DLL
,但这是不可能的。来自公司S的
M.EXE
可以扩展,我可以使用未管理的C++构建自己的DLL,称之为NODE.DLL
,如果我正确设置了一切,M.EXE
将调用该DLL。我希望构建NODE.DLL
,使其静态链接到公司C的O.DLL
。但问题在于,一旦M.EXE
运行,它就已经加载了来自\S\BIN
的U.DLL
库,并且由于每个公司如何构建U.DLL
的原因,\S\BIN\U.DLL
中的符号略有不同于\C\BIN\U.DLL
中的符号。因此,当M.EXE
尝试加载NODE.DLL
时,会失败,因为当NODE.DLL
加载需要U.DLL
的O.DLL
时,从\C\BIN\U.DLL
所需的符号不存在,因为Windows认为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
的方式。它们来自第三方,因此静态链接不能被更改。我也无法使用LoadLibrary
加载O.DLL
,因为它是一个带有导入库的C++库。我相信可以使用清单文件,这样当我构建静态链接到O.DLL的
NODE.DLL
时,我可以在NODE.DLL
的清单文件中设置O.DLL
,使其加载安装在\C\BIN\U.DLL
的它自己的U.DLL
。我只是无法弄清楚如何做到这一点。理想情况下,我不想修改O.DLL
的清单文件,但如果这是唯一的解决办法,我将接受这种方案。
O.DLL
在其 IAT 中指定了未经限定的U.DLL
作为链接对象。 - MSalters