【问题标题】:Trying to load a DLL with LoadLibrary and get R6034 "An application has made an attempt to load the C runtime library incorrectly"尝试使用 LoadLibrary 加载 DLL 并获得 R6034“应用程序尝试错误地加载 C 运行时库”
【发布时间】:2010-03-24 06:16:47
【问题描述】:

我正在编写一个加载 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);

}

【问题讨论】:

    标签: c++ c runtime loadlibrary


    【解决方案1】:

    从 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 上找到更多信息。

    【讨论】:

    • 刚从维基百科回来,几乎完全了解了你刚才所说的内容。 :-) 任何人都知道是否有使用 Code::Blocks 包含清单的内置方法,或者我是否需要在构建可执行文件后手动将其包含在 mt.exe 中?
    • manifest可以转换成资源直接链接进去。见msdn.microsoft.com/en-us/library/ms235591.aspx
    • 很难确定 mt.exe 的来源,但我设法使用 Windows SDK 中的清单生成和编辑工具创建了一个清单。对我来说似乎仍然是一堆巫术,但它现在有效,所以有一天我会担心它/如果我曾经公开这个应用程序。谢谢!
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多