Падает при записи в unmanadged память. StructureToPtr
От: Аноним  
Дата: 07.07.09 13:06
Оценка:
Вобщем понадобилось искать окошки на форме по классу.
Есть такая функция

        public TWindow Find<TWindow>(string text) where TWindow : Window, new()
        {
            var windowInfo = new WindowInfo
            {
                ClassName = GetWindowClass<TWindow>(),
                Text = text,
                Handle = IntPtr.Zero
            };

            IntPtr lParam = IntPtr.Zero;
            try
            {
                lParam = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WindowInfo)));
                Marshal.StructureToPtr(windowInfo, lParam, true);  <--- ***********************
                NativeMethods.EnumChildWindows(Handle, WindowFinder, lParam);
                windowInfo = (WindowInfo)Marshal.PtrToStructure(lParam, typeof(WindowInfo));
                if (windowInfo.Handle == IntPtr.Zero)
                    return null;
                return new TWindow { Handle = windowInfo.Handle };
            }
            finally
            {
              Marshal.FreeHGlobal(lParam);
            }
        }

которая со страшной силой крушит приложение или AccessViolationExeption в указаном месте.
За основу взял этот код
Автор: Vladek
Дата: 15.06.09
.
Более простой вариант работает без проблем

        static void FindWindow()    
        {
        
            IntPtr hWndE = panelTT.handle;        
            if (hWndE != IntPtr.Zero)        
            {
                EnumChildProcDelegate enumChildProc = new EnumChildProcDelegate(EnumChildProc);
                    EnumChildWindows(hWndE, enumChildProc, hWndE);        
            }    
        }    
        static bool EnumChildProc(IntPtr hWnd, IntPtr lParam)    
        {        
            const int CAPACITY = 256;        
            StringBuilder className = new StringBuilder(CAPACITY);
            GetClassName(hWnd, className, CAPACITY);        
      
            if (className.ToString() == "Edit")        
            {            
                _wndHandler = hWnd
                return false;
            }        
                   return true; 
        }

Но почему падает вышестоящий не пойму. Подскажите куда копать...
Re: Падает при записи в unmanadged память. StructureToPtr
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 07.07.09 13:30
Оценка:
Здравствуйте, Аноним, Вы писали:
Может нужно указать windowInfo.Size = Marshal.SizeOf(typeof(WindowInfo));

http://hall.org.ua:800/syberia1/browser/UserFiles/Wizzard/ZenStudio/Fireball.Win32/Fireball.Win32/Win32/Win32Window.cs?rev=5
и солнце б утром не вставало, когда бы не было меня
Re: Падает при записи в unmanadged память. StructureToPtr
От: Shvedskiy  
Дата: 07.07.09 13:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Но почему падает вышестоящий не пойму. Подскажите куда копать...


У тебя наверняка попытка записи в память меньшую по размеру, чем память которую занимает структура. Нормально опиши текстовые поля, чтобы Marshal.SizeOf(typeof(WindowInfo)) возвращал точное значение размера структуры. Пользуй атрибут MarshalAs, и смотри описание вызываемой функции, какого типа строки нужны в структуре.
Re: Падает при записи в unmanadged память. StructureToPtr
От: Ratel Смерть хохлопидарам.
Дата: 07.07.09 15:56
Оценка:
Здравствуйте, Аноним, Вы писали:

Если FW>=3 можно так(приблизительно):

  using System.Windows.Automation;


  AutomationElement formWindow = AutomationElement.FromHandle(this.Handle);
  Condition propCondition = new PropertyCondition(AutomationElement.ClassNameProperty, "Edit");
  AutomationElement mfWindow = formWindow.FindFirst(TreeScope.Descendants, propCondition);//есть также FindAll  :)

но это только найти окна.
I am Jack's Bugged Code.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.