微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LoadLibrary失败; GetLastError没有帮助

如何解决LoadLibrary失败; GetLastError没有帮助

| 我有一个从Visual Studio 2003 .NET转换为Visual Studio 2010的项目。它是Visual C ++(不受管理)。 DLL引入其他DLL。如果我将可执行文件与此DLL链接,则该可执行文件会在DLL初始化期间死亡。 (我可以说,有一些静态对象的构造函数,可以看到它们的操作。)我已经从路径中删除了所有VS 2010创建的DLL,但其中一个会导致错误。用VS.NET创建的版本替换该版本可以运行该程序。 由于我没有获得任何有用的信息,因此我决定编写一个不直接链接到DLL而是使用LoadLibrary加载库的测试应用程序。我的想法是我可以使用GetLastError()来帮助解决该库的问题。不行我收到错误代码-529697949,这根本不是Windows错误代码! (如果将DLL更改为VS.NET创建的版本,则程序将正确加载DLL。) 我使用了Dependency Walker(www.dependencywalker.com)来检查DLL,它告诉我“未找到至少一个延迟加载依赖性模块”,突出显示了IESHims.DLL和WER.DLL。我看到该工具没有其他错误。在VS.NET创建的DLL上运行它会显示两个相同的警告,因此我认为这是一条红色的鲱鱼。
static void showMessage(const wchar_t *wmsg)
{
        std::wcout << wmsg << std::endl;
        ::MessageBox(NULL,wmsg,TEXT(\"Message\"),MB_OK);
}

static void testLoadLibrary(const wchar_t *lib)
{
        ::SetLastError(0L);
        ::SetErrorMode(0);

        std::wstringstream wss;

        wss << \"LoadLibrary: \" << lib;
        showMessage(wss.str().c_str());
        HINSTANCE LoadME = ::AfxLoadLibrary(lib);
        if (LoadME == NULL) {
                DWORD dw = ::GetLastError();
                wss << \"Failed: Error code \" << dw;
                showMessage(wss.str().c_str());
                ErrorExit(lib,dw);
        } else {
                wss << \"LoadLibrary of \" << lib << \" succeeded.\";
                showMessage(wss.str().c_str());
                ::FreeLibrary(LoadME);
        }
}
最后,我运行Process Monitor(sysinternals.com)来监视测试程序,查看带有Path的所有条目,其中包含字符串“ dll”。在此列表中我看不到任何特别有用的信息-不知道为什么DLL无法加载。 如果我将LoadLibraryEx与DONT_RESOLVE_DLL_REFERENCES一起使用,则会加载该库,因此确实看起来像是一个依赖项问题,这就是为什么我对依赖项遍历没有特别帮助感到惊讶的原因。 我已经在Windows 2008 R2和Windows 2003上进行过尝试;同样的行为。 有什么建议么?     

解决方法

        有一个OS工具可以帮助诊断此类问题。下载SDK或DDK,并使用gflags.exe为该过程设置\'Show Loader Snaps \'(+ sls)。那应该揭示为什么DLL加载失败。 加载器快照输出将出现在调试器输出窗口中。 马丁     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?