LoadLibrary失败; GetLastError没有帮助

时间:2011-05-27 15:41:24

标签: visual-c++ loadlibrary

我有一个项目,我从Visual Studio 2003 .NET转换为Visual Studio 2010.它不是一个.NET项目;它是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)来监视测试程序,查看包含字符串“dll”的Path的所有条目。我没有在这个列表中看到任何特别有用的信息 - 不知道为什么DLL无法加载。

如果我使用带有DONT_RESOLVE_DLL_REFERENCES的LoadLibraryEx,那么库会加载,所以这看起来像是依赖性问题,这就是为什么我很惊讶依赖性walker不是特别有帮助。

我在Windows 2008 R2和Windows 2003上试过这个;同样的行为。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

有一个操作系统工具可以帮助诊断这样的问题。下载SDK或DDK并使用gflags.exe为进程设置“Show Loader Snaps”(+ sls)。这应该揭示DLL加载失败的原因。

加载程序快照输出将出现在调试器输出窗口中。

马丁