Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2016, 05:49   #1
V1ruSpw
 
Регистрация: 10.06.2014
Сообщений: 3
По умолчанию Не верная работа GetWindowText с google Chrome - Delphi WinAPI

Имеется прекрасный софт, который ищет название всех заголовков окон открытых в системе, а так же кусок кода который говорит hwnd окна в слуае если имеется с таким названием . Суть проблемы такова : поэкспериментировав с гугл хромом и апи функцией GetWindowText обнаружилась проблема, которую по крайней мере я , не могу исправить, так как не понимаю в чем собственно проблема.

Для демонстрации бага была эмулирована работа по таймеру апи функции GetWindowText. При открытии новой вкладки в браузере гугл хром, именно не пустой вкладки а вкладки с имеющейся информацией, к примеру с любого поисковика, в момент ее создания при вызове функции GetWindowText происходят проблемы которые крашут приложение. Это Access Violation Write at adress .... после чего Stack OverFlow. Программа написана на Embarcadero Rad Studio XE7. Подскажите в чем может быть проблема и как ее решить?

PHP код:
unit Unit1;
 
interface
 
uses
  Winapi
.WindowsWinapi.MessagesSystem.SysUtilsSystem.VariantsSystem.ClassesVcl.Graphics,
  
Vcl.ControlsVcl.FormsVcl.DialogsVcl.StdCtrlsVcl.ExtCtrls;
 
type
  TForm1 
= class(TForm)
    
Button1TButton;
    
Memo1TMemo;
    
Button2TButton;
    
Edit1TEdit;
    
Timer1TTimer;
    
procedure Button1Click(SenderTObject);
    
procedure Button2Click(SenderTObject);
    
procedure Timer1Timer(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;
 
var
  
Form1TForm1;
 
implementation
 
{$R *.dfm}
 
 
 
 
 
 
procedure TForm1.Button1Click(SenderTObject);
var 
wndhwnd;
    
buff: array [0..127of char;
begin
wnd 
:= GetWindow(handlegw_hwndfirst);
 
while 
wnd <> do
  
begin // Не показываем:
    
if (wnd <> Application.Handle// Собственное окно
      
and IsWindowVisible(wnd// Невидимые окна
   //   and (GetWindow(wnd, gw_owner) = 0) // Дочерние окна
      
and (GetWindowText(wndbuffSizeOf(buff)) <> 0then
 
  begin
  GetWindowText
(wndbuffSizeOf(buff));
 
// Memo1.lines.Add(StrPas(buff));
  
end;
wnd := GetWindow(wndgw_hwndnext);
end;
 
 
 
end;
 
procedure TForm1.Button2Click(SenderTObject);
var 
a:hwnd;
begin
a
:=FindWindow(nilPWideChar(Edit1.text));
 
end;
 
 
procedure TForm1.Timer1Timer(SenderTObject);
begin
 
//  Button2Click(Sender);
   
Button1Click(Sender);
end;
 
end
V1ruSpw вне форума Ответить с цитированием
Старый 25.01.2016, 06:24   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

Ну, например, сперва можно бы увеличить размер буфера
Код:
buff: array [0..127] of char;
раз этак в 8 (0..1023) или ещё больше.
Потом я бы проконтролировал Char и следовательно SizeOf(Buff) - на юникодных дельфи чар длиной 2 байта и сайзоф от массива лучше вообще переделать на Length(Buff) * SizeOf(Char), ну и юникодные ли версии винапишных функций вызываются.
Последнее - проконтролировал верно ли работает StrPas с таким буфером - хотя бы по справке, может стоит посмотреть в сторону простого каста, т.к. мемо себе юник строку создаст всё равно, а не будет брать ссыль на буфер.
phomm вне форума Ответить с цитированием
Старый 25.01.2016, 09:11   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Для узнавания размера требуемого буфера есть GetWindowTextLength, а у самой GetWindowText есть Return value, исходя из которого можно вызвать ShowMessage с GetLastError.

И наконец последнее, для Winodws, Google Chrome это одно окно, внутри которого нет других компонент, т.е. браузер все внутренности сам рисует.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2016, 10:51   #4
V1ruSpw
 
Регистрация: 10.06.2014
Сообщений: 3
По умолчанию

Проблема была решена добавлением слипа в 40 ms перед GetWindowText.
V1ruSpw вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Google Chrome Crystal Matrix Софт 21 22.05.2015 07:39
GetWindowText WinApi Lokki23 Win Api 2 20.11.2013 17:49
WinApi и Google Chrome V1S Общие вопросы Delphi 1 12.11.2011 20:29
Google Chrome Syltan Операционные системы общие вопросы 1 16.04.2010 08:18
Не верная работа автофильтра DsXack Microsoft Office Excel 2 06.11.2009 08:50