3

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

}
4

3 回答 3

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

于 2010-03-24T06:46:20.437 回答
1

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

于 2010-03-24T06:26:35.520 回答
1

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

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'\"")
于 2011-07-17T08:09:24.863 回答