尝试使用LoadLibrary加载DLL并获取R6034“应用程序尝试错误地加载C运行时库”

时间:2010-03-24 06:16:47

标签: c++ c runtime loadlibrary

我正在编写一个加载Winamp输入插件的包装器程序。到目前为止,我已经使用了很多插件,但是对于其他一些插件,当我尝试在插件的DLL上调用LoadLibrary时,我在运行时收到错误消息。 (这似乎主要发生在Winamp附带的插件中。)出现一个对话框,给出了上面的错误代码和消息。例如,使用in_flac.dll和in_mp3.dll插件(与Winamp一起提供)就会发生这种情况。关于如何解决这种情况的任何想法?

编辑: 这基本上遍历目录中的插件并尝试加载然后释放每个插件。有些插件会产生我上面提到的错误,而有些插件却没有。

wstring path = GetSearchPath();

FileEnumerator e(path + L"in_*.dll");

while(e.MoveNext()) {

    wstring pluginPath = path + e.GetCurrent().cFileName;

    MessageBoxW(NULL, pluginPath.c_str(), L"Message", MB_OK);
    HINSTANCE dll = LoadLibraryW(pluginPath.c_str());
    if(!dll) {

        pluginPath = wstring(L"There was an error loading \"") + wstring(e.GetCurrent().cFileName) + L"\":\n" + LastErrorToString();
        MessageBoxW(NULL, pluginPath.c_str(), L"Error", MB_OK);

        continue;

    }

    FreeLibrary(dll);

}

3 个答案:

答案 0 :(得分:3)

从Visual Studio 2005开始,C / C ++运行时必须放在Windows并行缓存(C:\ windows \ WinSxS)中,因此将CRT DLL放在你的exe旁边不再起作用(有一个例外,见后文)。 您还必须通过清单文件引用CRT DLL。此清单文件由链接器生成,其名称类似于myexe.exe.manifest或mydll.dll.manifest。使用您的应用程序/ DLL分发此清单,或使用mt命令将其链接到exe / dll中。

Windows XP中引入了并行缓存和清单文件系统,主要用于解决DLL地狱问题并提高安全性。

不使用清单引用CRT或不将CRT放在并排缓存中将产生错误6034.

如果您仍想将CRT DLL放在应用程序的旁边,您还可以使用私有程序集,这意味着在应用程序的文件夹中创建一种迷你并行缓存。您可以在MSDN上找到更多信息。

答案 1 :(得分:1)

可能有很多原因......把你的代码放在这里澄清......许多解决方案之一可能是 使用清单重建您的应用程序。使用Visual Studio构建应用程序会自动将清单放入生成的EXE或DLL文件中。如果要在命令行中构建,请使用mt.exe工具将清单添加为资源。如果构建EXE,则使用资源ID 1;如果构建DLL,则使用2。

答案 2 :(得分:1)

此外,您可以尝试将其添加到代码中:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'\"")