我正在编写一个加载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);
}
答案 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'\"")