我在VS2005中编写的应用程序是一个32位软件。它在Windows Server 2008,Windows 7(64位)上运行良好,但不能在Windows服务器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,但它没有帮助。
我甚至看过依赖性walker(我真的很新),并且发现了一些以黄色显示的Windows dll(例如msvcr80.dll)。我将它们复制到我的应用程序文件夹中,但这也无效。
有人可以就如何解决这个问题提出任何想法吗?我应该安装什么版本的可再发行组件或者有关如何使用依赖性walker的一些提示。请帮忙
答案 0 :(得分:1)
尝试检查Windows事件日志。它位于控制面板周围 - >管理工具 - >事件查看器 - > Windows日志 - >应用。通常你会看到那些在预期版本中找不到的确切DLL也应该匹配。
答案 1 :(得分:0)
可能无法加载dll,因为错误:"尝试加载格式不正确的程序。"。 一个dll构建平台taget" x86"在Win 7 x86或x64中正常工作但不能在Win 2012 Server x64中工作。 使用平台目标编译dll"任何CPU"
答案 2 :(得分:0)
我读到自Windows 7以来依赖性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)。 不幸的是,没有人写下一本好的手册如何使用它。所以这些是步骤:
检查输出的最后一行。在某处会有一个带有ERROR的条目。我看了:
14b0:15ec @ 00131328 - LdrpSearchPath - RETURN:状态: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 - RETURN:状态:0xc0000135 14b0:15ec @ 00131328 - LdrLoadDll - RETURN:状态:0xc0000135 ' UE4Editor.exe' (Win32):已卸载' C:\ Windows \ System32 \ mfreadwrite.dll'
" clAmdFft.Runtime.dll"这是给出问题的DLL。安装它,文件路径有效并在项目中配置,确保它没有损坏,并且版本正确x86 / x64。
在我的情况下,我自己添加了这个库,用于我正在使用的自定义代码。
现在再次禁用GFLAGS,因为它会降低计算机速度并重新启动。