DllGetVersion не дает ожидаемых результатов под Windows 7 - PullRequest
0 голосов
/ 09 ноября 2009

У меня есть код, который пытается проверить, работает ли мое приложение с установленными темами. Вот код C #:

internal class NativeMethods
{

   [DllImport("comctl32", CharSet = CharSet.Auto, SetLastError = true)]
   internal static extern uint DllGetVersion(ref DLLVERSIONINFO pdvi);

   [StructLayout(LayoutKind.Sequential)]
   internal struct DLLVERSIONINFO
   {
    public uint cbSize;
    public uint dwMajorVersion;
    public uint dwMinorVersion;
    public uint dwBuildNumber;
    public uint dwPlatformID;
   }

            internal static bool IsThemed()
   {
    bool retval = false;

    if ((Environment.OSVersion.Version.Major >= 5 &&
      Environment.OSVersion.Version.Minor >= 1) ||
      Environment.OSVersion.Version.Major > 5)
    {
     bool appThemed = NativeMethods.IsAppThemed();
     bool themeActive = NativeMethods.IsThemeActive();

     if (appThemed && themeActive)
     {
      DLLVERSIONINFO dvi = new DLLVERSIONINFO();
      dvi.cbSize = (uint)Marshal.SizeOf(dvi);

      NativeMethods.DllGetVersion(ref dvi);

      retval = (dvi.dwMajorVersion >= 6);
     }
    }
}

Этот код отлично подходит для моих нужд в Windows XP, 2003 и Vista. Однако, когда я пытаюсь сделать это под Windows 7, где я запускаю Aero, вызов DllGetVersion возвращает значение меньше 6. Когда я отлаживаю свое приложение и смотрю номер версии comctl32 в отладчике (окно модулей), он показывает номер версии больше 6 загружен. Почему мой код возвращает другое число?

Спасибо

Notre

1 Ответ

0 голосов
/ 09 ноября 2009

Глядя на MSDN для DllGetVersion(), кажется, что это не лучший способ сделать то, что вы пытаетесь сделать. Так как это не API-функция, возможно, это как-то изменилось в Win7 и не может быть вызвано таким же образом.

Если вы используете WinForms, вы можете попробовать вызвать Application.RenderWithVisualStyles - похоже, он делает то, что вы пытаетесь сделать выше.

...