Уважаемая реализация оболочки .NET с открытым исходным кодом ( SharpBITS ) из Служб Windows BITS не может определить базовую версию BITS под Win7 x64.
Вот исходный код, который не работает.NativeMethods - это нативные вызовы Win32, заключенные в методы .NET и оформленные с помощью атрибута DllImport.
private static BitsVersion GetBitsVersion()
{
try
{
string fileName = Path.Combine(
System.Environment.SystemDirectory, "qmgr.dll");
int handle = 0;
int size = NativeMethods.GetFileVersionInfoSize(fileName,
out handle);
if (size == 0) return BitsVersion.Bits0_0;
byte[] buffer = new byte[size];
if (!NativeMethods.GetFileVersionInfo(fileName,
handle,
size,
buffer))
{
return BitsVersion.Bits0_0;
}
IntPtr subBlock = IntPtr.Zero;
uint len = 0;
if (!NativeMethods.VerQueryValue(buffer,
@"\VarFileInfo\Translation",
out subBlock,
out len))
{
return BitsVersion.Bits0_0;
}
int block1 = Marshal.ReadInt16(subBlock);
int block2 = Marshal.ReadInt16((IntPtr)((int)subBlock + 2 ));
string spv = string.Format(
@"\StringFileInfo\{0:X4}{1:X4}\ProductVersion",
block1,
block2);
string versionInfo;
if (!NativeMethods.VerQueryValue(buffer,
spv,
out versionInfo,
out len))
{
return BitsVersion.Bits0_0;
}
...
Реализация следует за буквой инструкции MSDN .Тем не менее во время второго вызова VerQueryValue (...) приложение вылетает и без колебаний завершает сеанс отладки .Еще немного отладочной информации прямо перед сбоем:
- spv => "\ StringFileInfo \ 040904B0 \ ProductVersion"
- buffer => byte [1900] - заполнено двоичными данными
- block1 => 1033
- block2 => 1200
Я посмотрел на целевой файл "C: \ Windows \ System32 \ qmgr.dll" (РеализацияBITS) через Windows.Это говорит о том, что версия продукта - 7.5.7600.16385.Вместо сбоя это значение должно возвращаться в строке verionInfo.Любой совет?