Как найти хендл контрола

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.11.2012 (Чт) 20:24

ger_kar писал(а):
Qwertiy писал(а):GetWindowClass
Может GetClassName?

Ну да, перепутал.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как найти хендл контрола

Сообщение ger_kar » 29.11.2012 (Чт) 21:21

Qwertiy писал(а):Ну да, перепутал.
Все равно спасибо. Ибо начал искать GetWindowClass, и нашел GetClassName :)

А вообще - какой функциональности не хватает, если не секрет. Может, по другому решить можно? И чем стандартный DTP не устраивает?
Нет никаких секретов :) Стандартный мне не нравиться многим, включая и внешний вид. У того контрола, который я хочу допилить до нормального, тоже куча недостатков, но их проще устранить, чем переделать стандартный контрол. Привязать к текстовому полю не проблема. Сделать так что-бы он захлопывался при двойном клике на дате тоже. Есть еще досадные недоразумения, но думаю и их можно будет исправить.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.11.2012 (Чт) 22:34

ger_kar писал(а):
Qwertiy писал(а):Ну да, перепутал.
Все равно спасибо. Ибо начал искать GetWindowClass, и нашел GetClassName :)

Я поэтому и перепутал. Когда писал торопился, для проверки имени просто кинул его в гугл, результат показался убедительным :roll:

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 30.11.2012 (Пт) 2:05

ger_kar писал(а):Конечно в этом случае можно не париться со структурой, и сделать:
Declare Function ChildWindowFromPoint Lib "user32.dll" (ByVal hWndParent As Long, ByVal x As Long, ByVal y As Long) As Long
Но возникает вопрос, может все таки можно исхитриться и передать как то структуру ByVal? Хорошо, в этом случае всего два поля и передать их по отдельности не проблема, а вот если структура не такая простая? Или таких случаев в принципе не бывает? Я тоже удивился, до этого не разу не встречал передачу структуры ByVal.

ИМХО, только так и можно передать структуру ByVal - по очереди запихивая в стэк. Эта фунцкия (как и WindowFromPoint) - пережиток 16-битных платформ, когда длина этой структуры была 32 бита, потому и передавалась ByVal. Большие структуры никто в стэк запихивать не будет.
ger_kar писал(а):И еще, если таким образом структуру пихать с стек, то какое поле должно идти первым?
Зависит от размера поля, разрядности системы и внутренней реализации функции. Так, в (Child)WindowFromPoint в 32-бит -> x,y, а в 16-бит ->y,x

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти хендл контрола

Сообщение Хакер » 30.11.2012 (Пт) 2:33

ark писал(а):Большие структуры никто в стэк запихивать не будет.

Не правда.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 30.11.2012 (Пт) 3:14

Хакер писал(а):Не правда
Это в смысле "Никогда не говори никогда"? :D Значит, с "никто" погорячился. Хотя с трудом даже теоретически могу представить себе такую ситуацию. Ну, разве что между процессами. Да и то вряд ли.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти хендл контрола

Сообщение Хакер » 30.11.2012 (Пт) 4:10

Да причём тут это? Есть функция, принимающая 8 параметров типа DWORD. Или есть функция, принимающая одну структуру с 8 полями типа DWORD?

Кому какая разница, какой из вариантов использовать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 30.11.2012 (Пт) 5:22

А третий вариант - функция, принимающая 1 параметр - ссылку на структуру с XXX полей DWORD?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти хендл контрола

Сообщение Хакер » 30.11.2012 (Пт) 5:40

Это совсем другой вариант. Он скомпилируется в другой код. Его применяют, ну и пусть себе применяют.

Тот вариант, при который ты сказал, что его никто не применяет. Он компилируется в абсолютно идентичный код, как если бы передавалась не структура по значению, а отдельные поля подряд. Из этого два следствия:
1) Если анализировать кучу готовых бинарник, дизассемблируя их, невозможно установить, что обозначенный вариант не применяется
2) Этот вариант не является ни менее эффективным, ни более эффективным, чем вариант с передачей всех параметров по очереди в виде «отдельных аргументов». Но оба этих варианта эффективнее, чем твой третий вариант «1 параметр — ссылка на структуру с N полей типа DWORD», если функция интенсивно использует поля переданной структуры.

И проанализировать все исходники мира, чтобы заявить, что такой вариант нигде не применяется ты тоже не мог.

Так почему же ты заявляешь, что такой вариант нигде и никто не применяет? Он не уступает в эффективности, он иногда короче в плане кода, он компилируется так же, как и вызов функции с кучей параметров.

Я не говорю, что этот вариант чем-то лучше. Но и «опускать» его тоже не стоит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 30.11.2012 (Пт) 8:07

Хакер писал(а):Но оба этих варианта эффективнее, чем твой третий вариант «1 параметр — ссылка на структуру с N полей типа DWORD», если функция интенсивно использует поля переданной структуры.
С какого перепугу? Данные со стека всё равно надо вытаскивать в ячейки памяти (если работать "интенсивно"), чем это эффективнее чем обращаться к полям структуры по смещению? Оба этих варианта эффективнее (возможно) если функция использует поля один раз в предопределённой последовательности - тогда можно сразу в регистры вытаскивать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти хендл контрола

Сообщение Хакер » 30.11.2012 (Пт) 8:12

Тем, что в случае передачи структуры можно взять данные по [esp+XX].
В случае передачи указателя на структуру, нужно сначала взять указатель по адресу [esp+AA] (или [ebp+BB] — если компилятор не шибко умный), затем этот адрес засунуть в какой-то регистр (например esi), а затем взять данные по адресу [esi+NN]. При этом значение esi может либо храниться на промежутке от одного обращения до другого, и в этом случае мы лишаемся одного РОН и «нам» придётся ютиться на меньшем количестве РОН под свою задачу. Либо не хранить esi между обращениями, но тогда при каждом обращении придётся опять сначала извлекать из стека указатель на структуру, а потом обращаться к полю, используя данный указатель.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 30.11.2012 (Пт) 9:03

Хакер писал(а):придётся ютиться на меньшем количестве РОН под свою задачу
А ютиться в урезанном стэке, ожидая stack overflow - лучше?
А как быть с выравниванием? А если в структуре не DWORDы?
ЗЫ Согласен поменять "никто" на "почти никто" :D

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти хендл контрола

Сообщение Хакер » 30.11.2012 (Пт) 9:07

ark писал(а):А ютиться в урезанном стэке, ожидая stack overflow - лучше?

Мы говорили про эффективность, а не принципиальную выполнимость. Стека существенно больше, чем регистр, переполнить его может что разве рекурсия, — контроллируемая или неконтроллируемая (не берём в расчёт alloca), — а в случае использования рекурсии передавать целую структуру каждую итерацию, конечно, полный бред.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как найти хендл контрола

Сообщение ger_kar » 30.11.2012 (Пт) 9:09

Вопрос в другом, в VB6 вообще нельзя передать сруктуру по значению. Или всё-таки способы существуют, пусть конечно с небольшими извращениями, но не такими сильными, как передача полей структуры по отдельности в виде отдельных аргументов :) .

<< PS: Прикольно, это получилось мое однотысячное сообщение :)
Бороться и искать, найти и перепрятать

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 30.11.2012 (Пт) 10:55

ger_kar писал(а):VB6 вообще нельзя передать сруктуру по значению
Да можно, только с теми же самыми извращениями. Хакер уже писал (и здесь я полностью согласен)
Хакер писал(а):Он компилируется в абсолютно идентичный код, как если бы передавалась не структура по значению, а отдельные поля подряд
А как передавать: как кучу аргументов или врукопашную запихивать поля в стэк - роли не играет, только в первом случае это делает сам компилер.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 30.11.2012 (Пт) 11:13

Хакер писал(а):не берём в расчёт alloca
A2W и W2A тоже? :D

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.11.2012 (Пт) 12:30

ark писал(а):А ютиться в урезанном стэке, ожидая stack overflow - лучше?

Размер стека можно задать при компиляции... По крайней мере, для Си++.
Кстати, out of memory тоже никто не отменял :)

ger_kar писал(а):Вопрос в другом, в VB6 вообще нельзя передать сруктуру по значению.

А если объявлять в TLB?

ark писал(а):А как быть с выравниванием? А если в структуре не DWORDы?

Структура внутри себя может содержать выравнивание.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти хендл контрола

Сообщение Хакер » 30.11.2012 (Пт) 12:49

Qwertiy писал(а):Размер стека можно задать при компиляции... По крайней мере, для Си++.

И для VB6 можно.

Qwertiy писал(а):А если объявлять в TLB?

Это ничего не меняет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как найти хендл контрола

Сообщение ark » 01.12.2012 (Сб) 4:59

Qwertiy писал(а):Размер стека можно задать при компиляции...
Можно также задать своему процессу приоритет реального времени, повесить своё окно поверх всех остальных, поставить в автозагрузку, обязательно запихать в трей и т.п.
Естественно, невозможно проверить все бинарники (а тем более все сырцы) мира. И структуры ByVal передают. И, возможно, существуют ситуации, когда это оправдано - но это, скорее, исключение. Возьмём WinAPI - за всю сразу ручаться не буду, но кроме (Child)WindowFromPoint и (c натяжкой) композитных WParam/LParam - не могу припомнить примеров передачи структуры не по ссылке.
Я, конечно, дико извиняюсь за код на классово чуждом языке - на VB будет гораздо больше
Код: Выделить всё
struct S {int a, b, c, d, e, f, g, h;}; //8 DWORD
//По значению
void foo(S s) {
    int ret=0,n=1000*1000;
    for (int i=0;i<n;i++){
        ret += s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h +
              s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h +
              s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h;
    }
}
//худший вариант - достаём структуру каждый раз
void bar(S* s) {
    int ret=0,n=1000*1000;
    for (int i=0;i<n;i++){
        ret += s->a + s->b + s->c + s->d + s->e + s->f + s->g + s->h +
              s->a + s->b + s->c + s->d + s->e + s->f + s->g + s->h +
              s->a + s->b + s->c + s->d + s->e + s->f + s->g + s->h;
   }
}
//Храним структуру
void bar2(S* s) {
    int ret=0,n=1000*1000;
    S x=*s;
    for (int i=0;i<n;i++){
        ret += x.a + x.b + x.c + x.d + x.e + x.f + x.g + x.h +
              x.a + x.b + x.c + x.d + x.e + x.f + x.g + x.h +
              x.a + x.b + x.c + x.d + x.e + x.f + x.g + x.h;
   }
}
int _tmain(int argc, _TCHAR* argv[]){
   S testStruct={1,2,3,4,5,6,7,8};
   clock_t start=clock(); foo(testStruct);
   std::cout << "Foo(ByVal S) takes " << clock()-start <<std::endl;
   start=clock();   bar(&testStruct);
   std::cout << "Bar(ByRef S) takes " << clock()-start <<std::endl;
   start=clock(); bar2(&testStruct);
   std::cout << "Bar2(ByRef S) takes " << clock()-start <<std::endl;
   std::cin.get();
   return 0;
}
Оптимизация отключена. Итого: 16, 30, 16. Кстати, ради спортивного интереса скомпилил с CLR - результат 8, 16, 3

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как найти хендл контрола

Сообщение Mikle » 01.12.2012 (Сб) 11:12

ark писал(а):возможно, существуют ситуации, когда это оправдано - но это, скорее, исключение

Код: Выделить всё
Type ARGB
  a As Byte
  r As Byte
  g As Byte
  b As Byte
End Type

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.12.2012 (Сб) 11:24

ark писал(а):Итого: 16, 30, 16.

А ничего, что вот эта строчка
ark писал(а):S x=*s;
копирует всю структуру в стек? Т. е. ты передал указатель, а потом разместил там ещё и саму структуру.

ark писал(а):И, возможно, существуют ситуации, когда это оправдано - но это, скорее, исключение.

Ну например, когда ты меняешь значения её полей, но не надо, чтобы это отразилось на основном экземпляре.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как найти хендл контрола

Сообщение ger_kar » 01.12.2012 (Сб) 12:33

А вообще тест конечно интересный.
ark писал(а): Кстати, ради спортивного интереса скомпилил с CLR
CLR - это что управляемый код или что-то другое? И почему например n=1000*1000а не просто n=1000000 в чем сокровенный смысл такой записи?
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.12.2012 (Сб) 12:57

ger_kar писал(а):CLR - это что управляемый код или что-то другое?

Да, CLR - это .NET. Правда, учитывая, что Си++ единственный язык, позволяющий смешивать managed и unmanaged код, это не должно ни на что влиять. Ну кроме оптимицации, наверное.

ger_kar писал(а):И почему например n=1000*1000а не просто n=1000000 в чем сокровенный смысл такой записи?

Чтобы явно показать количество нулей. Т. е. 1000*1000 сразу видно, что 6 нулей, а 1000000 - надо считать. Некий аналог пробела для группировки цифр. Хотя сам так (с умножением) не пишу.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как найти хендл контрола

Сообщение ger_kar » 01.12.2012 (Сб) 13:09

Qwertiy писал(а):Си++ единственный язык, позволяющий смешивать managed и unmanaged код
И что прямо в одном проекте и такой и сякой код можно заюзать?
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.12.2012 (Сб) 13:19

Код: Выделить всё
Structure TestStructure
  ' Sorry for this code
  ' Yes, they all are integers in VB.NET
  Public A, B, C, D, E, F, G, H As Integer
End Structure

Module Program

Private Const N As Integer = 1000000000

Private Function DoItByVal(ByVal X As TestStructure) As Integer
  Dim Res As Integer = 0

  For Q As Integer = 1 To N
    Res = Res Xor X.A Xor X.B Xor X.C Xor X.D Xor X.E Xor X.F Xor X.G Xor X.H
  Next Q

  Return Res
End Function

Private Function DoItByRef(ByRef X As TestStructure) As Integer
  Dim Res As Integer = 0

  For Q As Integer = 1 To N
    Res = Res Xor X.A Xor X.B Xor X.C Xor X.D Xor X.E Xor X.F Xor X.G Xor X.H
  Next Q

  Return Res
End Function

Private Function DoItWithByVal(ByVal X As TestStructure) As Integer
  Dim Res As Integer = 0

  With X
    For Q As Integer = 1 To N
      Res = Res Xor .A Xor .B Xor .C Xor .D Xor .E Xor .F Xor .G Xor .H
    Next Q
  End With

  Return Res
End Function

Public Sub Main()
  Dim Obj As New TestStructure()
  Dim Start As Date, Time As TimeSpan

  For Q As Integer = 1 To 4
    Start = Now()
    DoItByVal(Obj)
    Time = Now() - Start
    Console.WriteLine("DoItByVal #{0}: {1}", Q, Time.TotalMilliseconds())
  Next Q

  Console.WriteLine()

  For Q As Integer = 1 To 4
    Start = Now()
    DoItByRef(Obj)
    Time = Now() - Start
    Console.WriteLine("DoItByRef #{0}: {1}", Q, Time.TotalMilliseconds())
  Next Q

  Console.WriteLine()

  For Q As Integer = 1 To 4
    Start = Now()
    DoItWithByVal(Obj)
    Time = Now() - Start
    Console.WriteLine("DoItWithByVal #{0}: {1}", Q, Time.TotalMilliseconds())
  Next Q

  Console.ReadKey()
End Sub

End Module

Результаты:
Код: Выделить всё
DoItByVal #1: 4157.2378
DoItByVal #2: 4150.2374
DoItByVal #3: 4151.2374
DoItByVal #4: 4150.2374

DoItByRef #1: 4193.2398
DoItByRef #2: 4191.2398
DoItByRef #3: 4190.2396
DoItByRef #4: 4196.2401

DoItWithByVal #1: 4172.2386
DoItWithByVal #2: 4158.2379
DoItWithByVal #3: 4156.2378
DoItWithByVal #4: 4161.238

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.12.2012 (Сб) 13:20

ger_kar писал(а):
Qwertiy писал(а):Си++ единственный язык, позволяющий смешивать managed и unmanaged код
И что прямо в одном проекте и такой и сякой код можно заюзать?

Да. Даже в одном классе с некоторой магией :)

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как найти хендл контрола

Сообщение ger_kar » 02.12.2012 (Вс) 6:58

Qwertiy писал(а):Да. Даже в одном классе с некоторой магией
Интересная концепция :)
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти хендл контрола

Сообщение Хакер » 02.12.2012 (Вс) 7:53

Нет ничего подобного в С++. То что одно компания, маленькая или большая, решила выпустить расширение к языку с подобным функционалом — мало ли кто выпускает расширения к языку? Это не делает это частью С++.

А тема переносится в раздел «Windows-программирование».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.12.2012 (Вс) 12:04

Хакер писал(а):Нет ничего подобного в С++. То что одно компания, маленькая или большая, решила выпустить расширение к языку с подобным функционалом — мало ли кто выпускает расширения к языку? Это не делает это частью С++.

Если говорить о Си++.NET, рассматривая его как отдельный язык, то есть. Что я и имел в виду.
К тому же, насколько я представаляю, кроме майкрософтовского варианта, других с поддержкой managed-кода нет, верно?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как найти хендл контрола

Сообщение ger_kar » 02.12.2012 (Вс) 12:22

Qwertiy писал(а):К тому же, насколько я представаляю, кроме майкрософтовского варианта, других с поддержкой managed-кода нет, верно?
Есть. Уже есть и решения других производителей для программирования под платформу Net. Тот же Delphi
Бороться и искать, найти и перепрятать

Пред.След.

Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList