Как получить строки на английском при вызове GetVersionInfo
Я пытаюсь использовать FileVersionInfo.GetVersionInfo() для некоторых исполняемых файлов Windows, например, таких как rasapi32.dll. Система перенаправляет такие запросы в файлы ресурсов для русского языка (systemRoot\ru-Ru\rasapi32.dll.mui). Могу ли я избежать этого и получить информацию из реального исполняемого файла (rasapi32.dll) с английским копирайтом, названием продукта и т.д.?
Установка для System.Threading.Thread.CurrentThread.CurrentUICulture и System.Threading.Thread.CurrentThread.CurrentCulture значения «en-US» не помогает. Также установка для CultureInfo.DefaultThreadCurrentCulture и CultureInfo.DefaultThreadCurrentUICulture значения «en-US» тоже не работает. Что мне сделать, чтобы избежать перенаправления вызова GetFileVersionInfo() (вызывал функцию так же непосредственно из version.dll) в файлы mui, а читать оригинальные exe-шники?
Воспроизвести:
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
FileVersionInfo fileVersionInfoUS = FileVersionInfo.GetVersionInfo("C:\\WINDOWS\\system32\\rasapi32.dll");
}
fileVersionInfoUS.FileDescription будет содержать "API удаленного доступа", а в английской "Remote Access API", и т.п. остальные поля.
Ответы (1 шт):
решение проблемы (псевдокод):
IntPtr hModule = LoadLibraryEx(path, IntPtr.Zero, LoadLibraryFlags.LOAD_LIBRARY_AS_DATAFILE);
IntPtr hResource = FindResource(hModule, LP_NAME, LP_TYPE);
uint resSize = SizeofResource(hModule, hResource);
IntPtr resData = LoadResource(hModule, hResource);
IntPtr ipMemorySource = LockResource(resData);
..
GetFileVersionString(ipMemorySource, string.Format(CultureInfo.InvariantCulture, template, codepage, "CompanyName"));
private static string GetFileVersionString(IntPtr memPtr, string name)
{
..
if (VerQueryValue(new HandleRef(null, memPtr), name, ref memRef, out memLen))
{
if (memRef != IntPtr.Zero)
{
data = Marshal.PtrToStringAuto(memRef);
}
}
return data;
}