purebasic.info

PureBasic forum
Текущее время: Пн дек 10, 2018 6:34 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
СообщениеДобавлено: Пт мар 20, 2015 8:43 am 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 357
Благодарил (а): 14 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Вопрос решен. Оказывается необходимо использовать InitializeStructure(*object, _iTransport) и все нормально работает. Код ниже. :D

Код:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
;-CLASS INTERFACE
 
Interface iTransport
  RedrawBuffer()
EndInterface
 
;-CLASS TEMPLATE
 
Structure _iGadget
  x.l:y.l
  w.l:h.l
 
  dx.l:dy.l
 
  type.l ;
  hide.l
  on.l
  flag.l
 
  image_id_1.l
  image_id_2.l
  image_id_3.l
EndStructure
 
Structure _iTransport
  *vTable
 
  image_id_1.l; buf 1
  image_id_2.l; buf 2
  flip.l      ; flip buf  
  Map _iGadget._iGadget()
EndStructure
 
Procedure AddTransportGUIObject(W.l,H.l)
  Protected *object._iTransport
  *object = AllocateMemory(SizeOf(_iTransport))
  InitializeStructure(*object, _iTransport)
    If *object
      ;Make sure the *vTable field points to our virtual table.
        *object\vTable = ?VTable_TransportGUIClass
      ;Initialise track
        *object\image_id_1=CreateImage(#PB_Any,W,H)
        *object\image_id_2=CreateImage(#PB_Any,W,H)
       
        *object\_iGadget("Test")\x=0
       
       
       
    EndIf
  ;Return a pointer to our object.
    ProcedureReturn *object
EndProcedure
 
Procedure TransportClass_RedrawBuffer(*this._iTransport)
 
EndProcedure  
 
iTransport.iTransport=AddTransportGUIObject(10,10)
 
;***************************************************
DataSection
  VTable_TransportGUIClass:
   Data.i @TransportClass_RedrawBuffer()
EndDataSection



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 22, 2018 1:16 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 815
Благодарил (а): 22 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Попалась задачка исправления багов в старой программе на плюсах, в целом все просто, но для полноты картины нужно работать с классами.
Все адреса известны, код работает из обычной длл добавленной в импорт программы.

Допустим у нас есть такой класс:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TargetClass
{
public:
        virtual void Function0();
        virtual Data* GetPtrByIndex(int Index);
        virtual void Function2();
        virtual Data* GetFirstPtr();          
 
char _0x0004[4];
        DWORD Value1;
char _0x000C[8];
        DWORD Value2;
char _0x0018[8];
        DWORD Value3;
char _0x0020[8];
...
}


Зная адрес класса, я могу читать и менять значения Value1, Value2, Value2 итд просто через структуру, тк смещения и размеры известны.
Вопрос заключается в том как например можно вызвать функцию GetPtrByIndex()
На плюсах мы можем написать просто:

Код:
1
Data* List = pTargetClass->GetPtrByIndex(x);


Но поскольку функция "контексто-зависимая" (регистр 'ecx' должен быть "валиден" при вызове), чтобы сделать это из ПБ нужно корректно оформить код.

Подскажите как это должно выглядеть?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 22, 2018 1:49 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11335
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Интерфейсы не подошли?
Посмотри это. http://purebasic.mybb.ru/viewtopic.php?id=496
Там про ecx тоже написано.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 22, 2018 2:08 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 815
Благодарил (а): 22 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Пётр писал(а):
Интерфейсы не подошли?

Возможно через них и нужно делать, просто не использовал раньше.

В статье, насколько я понимаю, речь о создании новых объектов, в моем случае все вроде как проще,- нужно использовать уже существующие.
Указатель на экземпляр класса это адрес класса, я правильно понимаю? Тогда можно попробовать его в ecx перед вызовом помещать. Надо тестировать.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 22, 2018 2:22 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11335
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Интерфейс в PB это виртуальный класс в C++, т. е. как в твоем коде.
При вызове метода интерфейса указатель на экземпляр класса помещается в стек, т. е. передается первым параметром. В статье есть макрос, который это исправляет, заменяя на копирование в ecx.

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


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

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


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

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


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

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