DLL 无法在 windows server 2012 中加载
Posted
技术标签:
【中文标题】DLL 无法在 windows server 2012 中加载【英文标题】:DLL fails to load in windows server 2012 【发布时间】:2014-10-27 08:25:24 【问题描述】:我用 VS2005 编写的应用程序是 32 位软件。它在 Windows Server 2008、Windows 7(64 位)上运行良好,但不能在 Windows Server 2012 上运行。我试图找出缺少哪个 DLL,因为我从 LoadLibrary 收到错误“动态链接库 (DLL) 初始化例程失败”。给出错误的代码如下
m_plugin = LoadLibrary( pluginPath.c_str() );
if ( !m_plugin )
const string error( "Failed to load Library \"" + pluginPath + "\" " + GetLastErrorStdStr() );
CBLogger::log( error, HIGH_IMPORTANCE );
return false;
为了解决这个问题,我尝试安装 C++ 可再发行版本 8.0.61001,但没有帮助。
我什至查看了dependency walker(我对它真的很陌生)并确实找到了一些以黄色显示的Windows dll(例如msvcr80.dll)。我将它们复制到我的应用程序文件夹中,但也没有用。
有人可以就我应该如何解决这个问题提供任何想法吗?我应该安装什么版本的 redistributable 或者一些关于如何使用依赖 walker 的提示。请帮忙
【问题讨论】:
该错误不暗示缺少 DLL 作为原因。您的程序使用的 DLL 之一有一个返回 FALSE 的 DllMain() 入口点。您的问题中没有任何线索可以说明为什么会出现这种情况,您需要一个调试器。 我已经用代码编辑了我的问题。给出的错误在 LoadLibrary 中,这就是我返回 false 的地方。 dll 确实存在 - 我已经检查过了。 好吧,那么您应该能够确定哪个 DLL 是麻烦制造者。您加载的是第一个候选者,它可能是它使用的 DLL。如果您没有它的来源,请致电程序员寻求帮助。 还在挣扎。该控件没有到达它使用的 DLL 的构造函数。同一套代码在windows 2008 server 中运行,是不是可能缺少一些windows dll? CLR支持意味着:需要安装.NET Framework。 【参考方案1】:尝试检查 Windows 事件日志。它位于控制面板 -> 管理工具 -> 事件查看器 -> Windows 日志 -> 应用程序周围。通常,您会在此处看到未找到的确切 DLL 与也应该匹配的预期版本。
【讨论】:
【参考方案2】:是的,如果 DLL 在 Windows Server 2012 中没有 DLLMain 函数,则 LoadLibrary 会以某种方式失败。要解决此问题,您可以使用:
LoadLibraryEx(libraryname, NULL, DONT_RESOLVE_DLL_REFERENCES).
【讨论】:
【参考方案3】:可能无法加载 dll,因为错误:“尝试加载格式不正确的程序。”。 带有平台标记“x86”的 dll 构建在 Win 7 x86 或 x64 中可以正常工作,但在 Win 2012 Server x64 中无法正常工作。 使用平台目标“Any CPU”编译 dll
【讨论】:
【参考方案4】:我了解到,自 Windows 7 以来,dependency walker 不再可靠(它会给出误报)。当 LoadLibrary 失败时,您尝试加载的 dll 无法加载或依赖 dll。
当您在 Visual Studio 中打开项目时,您可以在 LoadLibraryW(Filename); 处暂停调试器;如果您可以修改源代码并重新编译,请调用 GetLastError() 以找出确切的问题作为建议这里LoadLibraryW() failing to load DLL in System32。
现在要找出缺少哪个 DLL,您必须使用 Windows 调试工具 GFLAGS https://msdn.microsoft.com/en-ca/library/windows/hardware/ff549557(v=vs.85).aspx。 GFlags 包含在 Windows 调试工具中(我不知道从哪里获得 Windows 调试工具。也许可以试试https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk)。 不幸的是,没有人写下一本好的手册如何使用它。所以这些是步骤:
-
假设已安装 Windows 10(64 位)和 Windows 调试工具。
安装SDK后,重启
然后点击窗口图标并输入“GFLAGS”
打开“全局标志 (X64) - 桌面应用程序”
在“系统注册表”选项卡的“全局标志”对话框中启用显示加载程序快照(第二个条目,左上角)
重新启动(是的,您必须重新启动!)
使用您的解决方案文件打开 Visual Studio。
在调试模式下运行 (Win64)
让应用程序通过错误运行
停止应用程序并关闭调试器
现在在 Visual Studio 中,转到“输出”窗格。并选择:显示来自:“调试”的输出
检查输出的最后一行。在某个地方会有一个带有 ERROR 的条目。我的阅读:
14b0:15ec @ 00131328 - LdrpSearchPath - 返回:状态:0xc0000135 14b0:15ec @ 00131328 - LdrpProcessWork - 错误:无法加载 DLL:“clAmdFft.Runtime.dll”,父模块:“C:\Users\steven\Documents\Unreal Projects\Revaro 4.11\Binaries\Win64\UE4Editor-Revaro。 dll”,状态:0xc0000135 14b0:15ec @ 00131328-LdrpLoadDllInternal-返回:状态:0xc0000135 14b0:15ec @ 00131328 - LdrLoadDll - 返回:状态:0xc0000135 'UE4Editor.exe' (Win32): 卸载 'C:\Windows\System32\mfreadwrite.dll'
"clAmdFft.Runtime.dll" 这是出现问题的 DLL。要么安装它,文件路径是有效的,并在项目中配置,确保它没有损坏和正确的x86/x64版本。
在我的例子中,我自己为我正在使用的自定义代码添加了这个库。
现在再次禁用 GFLAGS,因为它会减慢您的计算机并重新启动。
【讨论】:
以上是关于DLL 无法在 windows server 2012 中加载的主要内容,如果未能解决你的问题,请参考以下文章
Windows Server 2008 R2安装WAMPSERVER无法启动的解决方法
32 位 DLL 在 Server 2008 上“可能不兼容”,但在 Server 2003 上有效
Windows Server 2008 R2 安装oracle10g报错的解决方法