Форум: "Прочее";
Текущий архив: 2013.09.15;
Скачать: [xml.tar.bz2];
ВнизНадёжность GetWindowLong(H, GWL_USERDATA) Найти похожие ветки
← →
О-Сознание (2013-04-03 20:17) [0]Посмотрел, очень много кода в VCL держится на получении информации через эту функцию.
А вдруг прогер перепишет её?
Или кто-то сторонний.
Всё разрушится.
Как-то не надёжно получается. (Поправьте меня)
← →
Германн © (2013-04-03 20:21) [1]
> А вдруг прогер перепишет её?
WinAPI-шную функцию?
← →
clickmaker © (2013-04-03 20:21) [2]> А вдруг прогер перепишет её?
прогер в MS? и как ее можно переписать, чтобы всё разрушилось?
← →
брат Птибурдукова (2013-04-03 20:25) [3]Прогерия — очень редкое заболевание. Шансы на то, что её перепишет прогер, исчезающе малы.
← →
О-Сознание (2013-04-03 20:30) [4]
> Германн © (03.04.13 20:21) [1]
>
>
> > А вдруг прогер перепишет её?
>
> WinAPI-шную функцию?
Перепишет информацию через SetWindowLong.
Логично же.
← →
clickmaker © (2013-04-03 20:40) [5]> очень много кода в VCL держится на получении информации
> через эту функцию
кстати, а какого кода? В Д7 я нашел только объявление в Windows.pas
← →
О-Сознание (2013-04-03 20:47) [6]
> clickmaker © (03.04.13 20:40) [5]
>
> > очень много кода в VCL держится на получении информации
> > через эту функцию
>
> кстати, а какого кода? В Д7 я нашел только объявление в
> Windows.pas
>
Лень искать.
Чисто для примера, где обычно применяется:
uses Clipbrd;
function NewEditProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall;
var
s:string;
i:integer;
begin
if (uMsg=WM_PASTE) and Clipboard.HasFormat(CF_TEXT) then
begin
s := Clipboard.AsText;
for i:=1 to Length(s) do if (not (s[i] in ["0".."9"])) then begin uMsg:=0; break end
end;
result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam, lParam)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle,GWL_STYLE,GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);
SetWindowLong(Edit1.Handle,GWL_USERDATA,SetWindowLong(Edit1.Handle, GWL_WNDPROC, LPARAM(@NewEditProc)))
end;
← →
clickmaker © (2013-04-03 20:50) [7]> Лень искать
я поискал за тебя. Ни в Д7, ни в XE3 нету использования GWL_USERDATA
← →
О-Сознание (2013-04-03 20:55) [8]
> clickmaker © (03.04.13 20:50) [7]
>
> > Лень искать
>
> я поискал за тебя. Ни в Д7, ни в XE3 нету использования
> GWL_USERDATA
Да не суть.
Использование GWL_USERDATA - не надёжно.
← →
брат Птибурдукова (2013-04-03 21:02) [9]Аминь.
← →
Rouse_ © (2013-04-03 21:13) [10]GWL_USERDATA и DWL_USER это аналоги Tag у VCL классов.
О какой надежности ты говоришь? Это обычная переменная, не более того.
Буфером обмена тоже страшно пользоваться - его тоже постоянно все кому не лень очищают, но как-то живем...
← →
clickmaker © (2013-04-03 21:24) [11]Тэгами тоже ненадежно. И вообще, жить страшно
← →
О-Сознание (2013-04-03 21:40) [12]
> Rouse_ © (03.04.13 21:13) [10]
Это всё понятно.
GWL_USERDATA напрашивается записать туда.
Т.е. код, допустим тот что выше - не заработает.
Поэтому можно словить глюк использую такой код из чужой либы.
Почему бы не сделать защищенную глобальную переменную внутри либы?
Вместо указателя на WndProc получим нечто и всё полетит.
Зачем использовать GWL_USERDATA?
> Буфером обмена тоже страшно пользоваться - его тоже постоянно
> все кому не лень очищают, но как-то живем...
Что страшного?
← →
О-Сознание (2013-04-03 21:40) [13]Думаю это тянет на небольшую заметку для Реймона Чена.
← →
О-Сознание (2013-04-03 21:41) [14]* От Реймона Чена.
← →
DVM © (2013-04-03 21:45) [15]
> О-Сознание (03.04.13 21:40) [13]
> Думаю это тянет на небольшую заметку для Реймона Чена.
Ни на что это не тянет, паранойя это.
← →
брат Птибурдукова (2013-04-03 23:21) [16]
> Думаю это тянет на небольшую заметку для Реймона Чена
Сам себя не похвалишь — сидишь как оплёванный…
← →
clickmaker © (2013-04-03 23:26) [17]> От Реймона Чена.
Ага, пусть мир наконец узнает, в чем причина всех глюков от MS
← →
Игорь Шевченко © (2013-04-03 23:42) [18]Мне бы ваши заботы, господин учитель
← →
О-Сознание (2013-04-04 00:09) [19]
> DVM © (03.04.13 21:45) [15]
Читайте переводы у GunsМокера и
сравнивайте, так такие же маленькие заметки.
Да чего вы к нему привязались?
Прокомментируйте лучше 12 пост.
> Игорь Шевченко © (03.04.13 23:42) [18]
>
> господин учитель
Я не учу, а спрашиваю.
← →
О-Сознание (2013-04-04 00:11) [20]
> брат Птибурдукова (03.04.13 23:21) [16]
>
>
> > Думаю это тянет на небольшую заметку для Реймона Чена
> Сам себя не похвалишь — сидишь как оплёванный…
Левое слово пока в тред не вставишь, зря на ДМ заходил.
← →
имя (2013-04-04 01:44) [21]Удалено модератором
← →
DVM © (2013-04-04 10:18) [22]
> О-Сознание (04.04.13 00:09) [19]
> Да чего вы к нему привязались?
> Прокомментируйте лучше 12 пост.
А чего там комментировать? GWL_USERDATA такая же переменная как и любая другая, только привязанная к структурам окна. Разумеется в нее можно записать, т.к. есть отдельная функция для этого. Как впрочем можно записать и в любую другую область памяти, тем самым нарушив работу какого то кода.
Тебя не беспокоит, что вообще можно попортить многие структуры в Windows, указатели на которые ты получаешь под видом хэндлов? И ничего живут люди и программы.
Тебя беспокоит тот факт, то эту переменную кто-то кроме тебя одновременно с с тобой станет использовать для одного и того же окна? Ну так документировать надо данный факт, еще проверять, не записано ли там что-то перед использованием. А вообще эта переменная исключительно для пользовательского конечного кода, библиотеки не должны ее использовать.
← →
О-Сознание (2013-04-04 11:18) [23]
> DVM © (04.04.13 10:18) [22]
>
>
> > О-Сознание (04.04.13 00:09) [19]
>
>
> > Да чего вы к нему привязались?
> > Прокомментируйте лучше 12 пост.
>
> А чего там комментировать? GWL_USERDATA такая же переменная
> как и любая другая, только привязанная к структурам окна.
> Разумеется в нее можно записать, т.к. есть отдельная функция
> для этого. Как впрочем можно записать и в любую другую область
> памяти, тем самым нарушив работу какого то кода.
> Тебя не беспокоит, что вообще можно попортить многие структуры
> в Windows, указатели на которые ты получаешь под видом хэндлов?
> И ничего живут люди и программы.
>
> Тебя беспокоит тот факт, то эту переменную кто-то кроме
> тебя одновременно с с тобой станет использовать для одного
> и того же окна? Ну так документировать надо данный факт,
> еще проверять, не записано ли там что-то перед использованием.
> А вообще эта переменная исключительно для пользовательского
> конечного кода, библиотеки не должны ее использовать.
>
Вот об этом и говорю.
Не должны, но могут.
Портить хэндлы явный пример не правильного использования.
А юзер-дата - общая штука.
Надо помнить, что её может использовать кто-то другой.
И нужно перестраховаться на всякий случай, некто возьмёт и поместит код выше в либу, забудет, а потом будет удивляться почему не работает ничего.
← →
clickmaker © (2013-04-04 11:22) [24]> некто возьмёт и поместит код выше в либу, забудет, а потом
> будет удивляться почему не работает ничего
ССЗБ
← →
брат Птибурдукова (2013-04-04 11:29) [25]
> некто возьмёт и поместит код выше в либу, забудет, а потом
> будет удивляться почему не работает ничего
ага, "не будем показывать пальцем", как говорится
← →
Игорь Шевченко © (2013-04-04 12:52) [26]There"s no limit to how bad things can get
← →
О-Сознание (2013-04-05 20:02) [27]
> брат Птибурдукова (04.04.13 11:29) [25]
>
>
> > некто возьмёт и поместит код выше в либу, забудет, а потом
> > будет удивляться почему не работает ничего
> ага, "не будем показывать пальцем", как говорится
Ты за словами следить не пробовал?
Например, обработать приватные поля окна в WndProc делают через эту
функцию. Потом копируют и удивляются.
> clickmaker © (04.04.13 11:22) [24]
>
> > некто возьмёт и поместит код выше в либу, забудет, а потом
> > будет удивляться почему не работает ничего
>
> ССЗБ
Дык про это и речь, чтобы их не было.
← →
Rouse_ © (2013-04-05 20:12) [28]
> О-Сознание (05.04.13 20:02) [27]
Ты чего боишься то в итоге? То что тебе извне перепишут GWL_USERDATA?
А то что тебя извне могут открыть под отладчиком и вообще перекроить логику работы твоей программы - не боишься?
Плюнь и забудь - данное поле предназначено для программистов. Если программист переписывает данное поле, то не важно есть там твое значение или нет - программист явно знает что он делает.
← →
брат Птибурдукова (2013-04-05 20:21) [29]
> Ты за словами следить не пробовал?
И за словами, и за байтами, и за двойными словами следил… Теперь вот с этой ихней 64-битностью и за квад-словами следить придётся иногда.
← →
картман © (2013-04-05 21:34) [30]http://www.youtube.com/watch?v=Be1ZHRri78I
← →
О-Сознание (2013-04-07 17:31) [31]
> Rouse_ © (05.04.13 20:12) [28]
>
>
> > О-Сознание (05.04.13 20:02) [27]
> программист явно знает
> что он делает.
>
Ну-ну.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.09.15;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.002 c