Ошибки Windows Aero Forms - PullRequest
       3

Ошибки Windows Aero Forms

4 голосов
/ 19 февраля 2011

Хорошо, поэтому я следовал документам до мельчайших деталей, и при попытке отладки и запуска выдает следующее сообщение об ошибке (F5):

PInvokeStackImbalance был обнаружен Сообщение: вызов функции PInvoke 'VistaControls! VistaControls.Dwm.NativeMethods :: DwmExtendFrameIntoClientArea' разбалансировал стек. Это скорее всего потому, что управляемый ПИнвок подпись не соответствует неуправляемой целевая подпись. Проверьте, что соглашение о вызовах и параметры подпись PInvoke соответствует цели неуправляемая подпись.

Понятия не имею, что это значит или как это исправить! Может кто-нибудь помочь, пожалуйста? Есть предложения?

Я использовал это раньше, но на этот раз это не работает. Я использую VS2010 Express C # WinForms, .NET 4 (как это было раньше, когда я впервые использовал его много лет назад.)

Спасибо

Ссылка: http://windowsformsaero.codeplex.com/wikipage?title=Glass%20on%20WinForms&referringTitle=Documentation

И да, я заметил исправление, сделанное человеком внизу этой страницы, и я исправил это, но оно все равно не работает!

Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VistaControls.Dwm;

namespace One_Stop_Management
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            e.Graphics.FillRectangles(Brushes.Black, new Rectangle[] {
        new Rectangle(0, 0, this.ClientSize.Width, 30),
        new Rectangle(this.ClientSize.Width - 30, 0, 30, this.ClientSize.Height),
        new Rectangle(0, this.ClientSize.Height - 30, this.ClientSize.Width, 30),
        new Rectangle(0, 0, 30, this.ClientSize.Height)
    });
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            VistaControls.Dwm.DwmManager.EnableGlassSheet(this);
        }
    }
}

Ответы [ 2 ]

6 голосов
/ 19 февраля 2011

Вернувшись к .NET 3.5, вы просто скрыли проблему: дисбаланс стека все еще присутствует, вы просто не получите никаких исключений от помощника по управляемой отладке, который отвечает за обнаружение правильных вызовов P / Invoke, по неизвестной причинемне.

Подпись DwmExtendFrameIntoClientArea в библиотеке "Windows Forms Aero" неверна.

Вот оригинальная неуправляемая подпись:

HRESULT WINAPI DwmExtendFrameIntoClientArea(HWND hWnd, __in  const MARGINS *pMarInset);

Вотподпись в библиотеке:

[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);

Хотя на первый взгляд она кажется неуправляемой, это не так.PreserveSig = false говорит CLR интерпретировать возвращенный HRESULT и автоматически генерировать исключение, если оно соответствует ошибке (см. PreserveSig на MSDN ).Тип возвращаемого значения функции должен быть void, а не int, поскольку результат уже был получен из стека во время выполнения.

Измените на PreserveSig = true в коде библиотеки, и дисбаланс стека будетуйти.

0 голосов
/ 19 февраля 2011

Неважно.Я понял.Жаль, что это не работает с .NET 4!

Вам нужно перейти в Свойства проекта и изменить его с .NET Framework 4 на 3.5 или ниже *.

...