purebasic.info

PureBasic forum
Текущее время: Сб июл 21, 2018 6:34 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Вт фев 02, 2016 2:04 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Если добавить пару нулей, то уже не работает.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x=OpenLibrary(#PB_Any, "User32.dll")
Debug x
OpenLibrary(39411900, "User32.dll")
 
*MessageBox = GetFunction(x, "MessageBoxA")
If *MessageBox
  CallFunctionFast(*MessageBox, 0, @"Body", @"Title", 0)
EndIf
 
CloseLibrary(x)
 
*MessageBox2 = GetFunction(39411900, "MessageBoxA")
If *MessageBox2
  CallFunctionFast(*MessageBox2, 0, @"Body2", @"Title2", 0)
EndIf
 
CloseLibrary(39411900)

В этой строке возвращает 0.
Код:
1
*MessageBox = GetFunction(x, "MessageBoxA")

А в версиях начиная с 5.40, еще и виснет в CloseLibrary.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Вт фев 02, 2016 2:23 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6327
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Пётр писал(а):
Если добавить пару нулей, то уже не работает

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

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Вт фев 02, 2016 2:53 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
#PB_Any автоматом генерирует НОМЕР гаджета
Наглядный пример:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Procedure IsMouseOver(wnd) 
 Protected re.RECT, pt.POINT
 GetWindowRect_(wnd, re)
 GetCursorPos_(pt)
 ProcedureReturn PtInRect_(@re, pt\x | (pt\y<<32))
EndProcedure
 
Define but.i
 
If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  but = ButtonGadget(#PB_Any, 10, 40, 200, 20, "Standard Button")    ; #PB_Any автоматом генерирует НОМЕР гаджета
 
  Repeat
  Event = WaitWindowEvent()
  EventType = EventType()
  Select Event
    Case #WM_MOUSEMOVE    
     
      If IsMouseOver(GadgetID(but))       ; Так работает, это говорит что переменная but - просто номер гаджета, а не хендл  
   ;   If IsMouseOver(but)                : А так не работает
       
           Debug "Курсор на кнопке"
     
        EndIf
  EndSelect    
     
    Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
 


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Вт фев 02, 2016 3:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
kvitaliy писал(а):
это именно число, а не указатель на область памяти. Обычное число.
Указатель это число - адрес памяти. :)

pablov писал(а):
but - просто номер гаджета, а не хендл
Никто не утверждает что это хендл. Это указатель на внутреннюю структуру PB.

До сих пор не дизассеблировали программу и не посмотрели что же на самом деле возвращает функция когда ей передают #PB_Any? :?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Вт фев 02, 2016 4:00 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6327
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Пётр писал(а):
Это указатель на внутреннюю структуру PB.

Ты утверждаешь, что переменная x это указатель, а переменная y это номер гаджета, просто число,
По твоему это разные вещи и тогда мы сможем увидеть Body2 и Title2 - ведь CloseLibrary(x) закроет ту, что по указателю, а та что по номеру y останется.
Ну запусти и проверь:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
x=OpenLibrary(#PB_Any, "User32.dll")
y=x; присваиваем y нзачение x
OpenLibrary(y, "User32.dll")
 
Debug x
Debug y
 
*MessageBox = GetFunction(x, "MessageBoxA")
        If *MessageBox
          CallFunctionFast(*MessageBox, 0, @"Body", @"Title", 0)
        EndIf
       
        CloseLibrary(x)
     
*MessageBox2 = GetFunction(y, "MessageBoxA")
        If *MessageBox2
          CallFunctionFast(*MessageBox2, 0, @"Body2", @"Title2", 0)
        EndIf
       
        CloseLibrary(y)
 
 


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Вт фев 02, 2016 4:28 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Виснет. Но не учитывается еще один момент.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
x=OpenLibrary(#PB_Any, "User32.dll")
y=x; присваиваем y нзачение x
Debug OpenLibrary(y, "Kernel32.dll")
 
Debug x
Debug y
 
*MessageBox = GetFunction(x, "MessageBoxA")
Debug *MessageBox
If *MessageBox
  CallFunctionFast(*MessageBox, 0, @"Body", @"Title", 0)
EndIf
 
CloseLibrary(x)
 
*MessageBox2 = GetFunction(y, "GetLastError")
Debug *MessageBox2
If *MessageBox2
  Debug CallFunctionFast(*MessageBox2)
EndIf
 
CloseLibrary(y)

Это некорректный код и он не работает.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Чт фев 04, 2016 7:32 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 630
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Всё время считал что ани генерит число, что это идентификатор, метка и так далее.
Исхожу из этого.
Код:
1
2
3
4
 
x=гаджет(#any....
гаджет(0......// тут то любое число можно ввести
 



Чё вы спорите, вы оба можете задать вопрос феде, так сформулируйте, переведите и напишите феде.
Будет ответ, переведите и выложите сюда.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Чт фев 04, 2016 10:32 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6327
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
newJS писал(а):
Чё вы спорите, вы оба можете задать вопрос феде, так сформулируйте, переведите и напишите феде.
Будет ответ, переведите и выложите сюда.

Смысл позорится глупыми вопросами? В справке четко написано что это номер гаджета и #PB_Any его автоматически генерирует:
#Library A number to identify this library. #PB_Any can be used to auto-generate this number.
Любому, кто хоть что то понимает в Пурике известно, что ссылка на номер и сам номер - это разные вещи.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Чт фев 04, 2016 3:23 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Похоже Петр прав, судя по коду
Код:
1
2
3
4
5
6
7
8
9
10
Define but.i, pnt.i, hWnd.i 
If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
  but = ButtonGadget(#PB_Any, 10, 40, 200, 20, "Standard Button")  
 
  pnt  = PeekL(but)    : Debug pointer
  hWnd = GadgetID(but) : Debug hWnd
;  pnt == hWnd
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


При #PB_Any, возвращается не просто число, а указатель на hWnd. Ковыряние в OllyDBG это подтверждает.

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Чт фев 04, 2016 3:40 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6327
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
pablov писал(а):
судя по коду

Это куда:
Debug pointer ???

В любом случае, изначально вопрос не стоял, указатель или нет, вопрос был в другом - может ли при большом кол-ве #PB_Any быть повторения случайных чисел и могут ли по этой причине быть ошибке в программе.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Чт фев 04, 2016 3:54 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
kvitaliy писал(а):
может ли при большом кол-ве #PB_Any быть повторения случайных чисел и могут ли по этой причине быть ошибке в программе
Как уже выяснили при #PB_Any возвращается указатель и вопрос можно переформулировать в такой. Может ли AllocateMmemory возвращать одинаковые адреса памяти при условии что память НЕ будет освобождаться функцией FreeMemory?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Программа не завершается
СообщениеДобавлено: Пт фев 05, 2016 5:07 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
kvitaliy писал(а):
Это куда:
Debug pointer ???


Очепятка :) Должно быть Debug pnt

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB