Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
#1

Грязный хук. - C++

01.03.2010, 11:17. Просмотров 1802. Ответов 32
Метки нет (Все метки)

Провёл не большой анализ по одному коду, и выянил не которые особенности,
о которых не пишут в книгах о языке C++.
Это я узнал из книги INside COM.

Также помню не в тему спор завёл где то на форме, про виртуальный деструктор и
где его надо прописывать.
Правильнее и безопаснее прописывать конечно везде, если не брать концепцию COM.

C++
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
#include <iostream.h>
class Abstract {
public:
/*Абстрактному классу не нужен виртуальный деструктор потому что Release может действовать и без него,
*/
virtual long Release() = 0;
};
class MyClass: public Abstract  {
public:
    MyClass(){ cout<<"Create MyClass\n"; }
    virtual ~MyClass() {cout<<"Destroy\n"; }
    
virtual long Release(){
/*подразумивается как delete obj, верно ли я предполагаю, поэтому деструктор вызывается с нужного места  иерархии: тоесть с производного класса.
*/  delete this;                
             return 0;
    }
};
 
 
int main(){
MyClass  *obj = new MyClass;
Abstract *aobj = obj;
aobj->Release();
//delete aobj; не сработает так как в базовом нет виртуального деструктора.
return 0;
}
Тогда получается COM компонент явно через delete( к указателю базового класса) не удалить,
так как в базовом классе отстутсвует виртуальный деструктор.

Я то знаю почему надо что бы delete не работало, мне это известно.

Я просто хочу узнать у более опытных прогеров верно ли мое предположение о том как действует
Release():
/*подразумивается как delete obj, верно ли я предполагаю, поэтому деструктор вызывается с нужного места иерархии: тоесть с производного класса.
*/
Или применяется ещё что то.
Ответьте пожалейста, заранее благодарен.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2010, 11:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Грязный хук. (C++):

Глобальный хук клавиатуры - C++
Привет. Мне нужно сделать глобальный хук клавиатуры, но я не знаю как. В интернете примеров на C++ мало и все не работают, потому что люди...

Глобальный хук. Довести до ума - C++
Здравствуйте, решил изучить механизмы хуков, почитал статьи. Появились вопросы. Вот собственно если делать глобальный хук, то функцию...

Грязный фон - HTML, CSS
Как вы верстаете страницы с фоном &quot;грязными пятнами&quot; типа того, что в приложенной картинки? Я обычно мучаю дизайнеров, чтоб он вырезал мне...

Хук - C++ Builder
MSG msg; while(GetMessage(&amp;msg,NULL,0,0)) TranslateMessage(&amp;msg), DispatchMessage(&amp;msg); switch(msg.wParam) { case WM_LBUTTONUP:...

Хук - WordPress
Добрый день. Питаюсь отправить админу письмо при публикации поста пример ( add_action('publish_post', 'Моя функцыя')). При публикации поста...

Хук на C# (Hook on C#) - C#
добрый день. знаю на форуме много тем про всякие хуки клавиатуры или мыши, но вирусные программы меня не интересуют, я хотел бы узнать как...

32
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
01.03.2010, 16:27 #16
С точки зрения стандарта

Добавлено через 10 минут
Правда в стандарте ничего по этому поводу не нашёл
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 16:34 #17
Цитата Сообщение от Evg Посмотреть сообщение
Метод Release нельзя вызывать из другого метода класса. Этого, на мой взгляд, достаточно для того, чтобы такое действие считалось невалидным
Метод Release не предназначен для вызова из методов самого класса, у него другое назначение - его должны вызывать клиенты, когда необходимость в ссылке на объект отпадает.
Такой подход как раз таки используется в технологии COM.
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
01.03.2010, 16:41 #18
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Метод Release не предназначен для вызова из методов самого класса, у него другое назначение - его должны вызывать клиенты, когда необходимость в ссылке на объект отпадает
Я сейчас о говорю не о самой технике, а о том, насколько допустимым считается подобное действие с точки зрения стандарта. У меня сейчас что-то типа "ж..й чую, что литр, но доказать не могу"
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 17:03 #19
Цитата Сообщение от Evg Посмотреть сообщение
Я сейчас о говорю не о самой технике, а о том, насколько допустимым считается подобное действие с точки зрения стандарта.
По поводу delete this, никаких упоминаний в стандарте нет.
Это легальная операция, если память выделена с помощью оператора new и никаких обращений к указателю this после вызова delete this не последует.
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
01.03.2010, 18:08 #20
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это легальная операция, если память выделена с помощью оператора new и никаких обращений к указателю this после вызова delete this не последует.
Она условно легальная. Т.е. такой метод можно вызывать только вне класса. А такое ограничение наводит на подозрение о нелегальности
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 18:13 #21
Evg, по поводу условий легальности delete this: [16.15] Is it legal (and moral) for a member function to say delete this?
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 18:18  [ТС] #22
CyBoSSeR:
Оперативно.
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
01.03.2010, 18:32 #23
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Evg, по поводу условий легальности delete this: [16.15] Is it legal (and moral) for a member function to say delete this?
А у тебя есть 100% уверенности по всем пунктам, которые написаны в этом факе? Т.е. если ты между delete и return не написал ни одной строки, то есть у тебя гарантия 100%, что между ними компилятор не наплодит какого-то кода (хотя бы по части exception'ов, о которых писал выше), который может зацепить this?

Добавлено через 8 минут
Просто вот о чём я пишу:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class T
{
public:
  T();
  ~T();
};
 
extern int func2 (void);
 
int func (void)
{
  T t;
 
  return func2();
}
Функция func проще некуда, однако код нехилый

Код
...
        call    _Z5func2v, 0  <--- это вызов func2
         nop
.LLEHE1:
        mov     %o0, %l0
        add     %fp, -24, %g1
        mov     %g1, %o0
.LLEHB2:
        call    _ZN1TD1Ev, 0  <--- это вызов деструктора t (ожидаемо)
         nop
.LLEHE2:
        st      %l0, [%fp-28]
        b       .LL1    <---- это переход в конец процедуры (на return)
         nop
.LL6:
        st      %i0, [%fp-32]  <--- отсюда начинается код по размотке стека
.LL2:
        ld      [%fp-32], %l0
        add     %fp, -24, %g1
        mov     %g1, %o0
        call    _ZN1TD1Ev, 0
         nop
        st      %l0, [%fp-32]
.LL4:
        ld      [%fp-32], %o0
.LLEHB3:
        call    _Unwind_Resume, 0
         nop
.LLEHE3:
.LL1:
        ld      [%fp-28], %i0  <--- вот здесь реальный выход из процедуры
        ret
        restore
.LLFE2:
        .size   _Z4funcv, .-_Z4funcv
Данный тест не совсем подходит к нашей теме, поскольку в процедуре мы имеем локал типа класс. Но точно ли нет ситуаций, когда в "простом" методе не выскочит вот такой вот код. Я плохо владею плюсами, чтоы экспериментировать. Может для этого нужно какое-то ацкое множественное виртуальное наследование или ещё что-то типа того. К тому же здесь используется версия gcc, умеющая работать с libunwind, а другие компиляторы могут это дело реализовывать по другому и механизм будетболее тяжёлым
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 19:07  [ТС] #24
Если б Release(); портило всю малину его бы не использовали.
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 19:08 #25
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Evg Посмотреть сообщение
А у тебя есть 100% уверенности по всем пунктам, которые написаны в этом факе? Т.е. если ты между delete и return не написал ни одной строки, то есть у тебя гарантия 100%, что между ними компилятор не наплодит какого-то кода (хотя бы по части exception'ов, о которых писал выше), который может зацепить this?
Да, я практически на 100% уверен, что если все приведенные пункты соблюдены, то проблем с использованием конструкции delete this не будет.

Кроме того, компиляторы разрабатывают не идиоты (я на это очень надеюсь), и никаких лишних обращений к this компилятор не наплодит, при условии что у программиста, использующего конструкцию, руки растут из правильного места.

Насчет исключений, вопрос также сводится к "пряморукости" программиста.

Опять же, я не знаю способа, позволяющего обойтись без данной конструкции при разработке объектов, непосредственно поддерживающих счетчик ссылок.
3
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 19:14  [ТС] #26
"пряморукости" программиста.
В точку.
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
01.03.2010, 20:38 #27
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Кроме того, компиляторы разрабатывают не идиоты (я на это очень надеюсь), и никаких лишних обращений к this компилятор не наплодит, при условии что у программиста, использующего конструкцию, руки растут из правильного места.
Я не пытаюсь оспаривать этот факт. Я просто спрашиваю, насколько ты уверен. Я в Си++ не специалист, а потому не могу оценивать подобные вещи "навскидку".

> Если б Release(); портило всю малину его бы не использовали

Его используют только под виндами на мелкомягком компиляторе или на всех архитектурах?
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 21:19  [ТС] #28
Evg:
COM в основном распространен на платформах майкрософт.
Evg:
Хотел спросить если ты в сеть выходишь с Lunix, поддерживает ли твой Web браузер
ActiveX компоненты.
Мне даже самому интересно, ActiveX же построена на COM.
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
01.03.2010, 21:22 #29
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Хотел спросить если ты в сеть выходишь с Lunix, поддерживает ли твой Web браузер
ActiveX компоненты.
Мне даже самому интересно, ActiveX же построена на COM.
Это что? Типа видео с ютуба. Такое поддерживает
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 21:26  [ТС] #30
http://www.emanual.ru/download/www.eManual.ru_1.html
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 21:26
Привет! Вот еще темы с ответами:

Хук клавиатуры - C#
Доброго времени суток, я пытаюсь сделать хук клавиатуры столкнулся с таким вопросом. Как сделать что бы в лог записывался читаемый текст...

Хук на ZwEnumerateKey - Программирование драйверов
Добрый день, помогите советом. Есть у меня один драйвер, который перехватывает функцию ZwEnumerateKey и скрывает определенные ключи в...

Хук клавиатуры - C++ WinAPI
Нужно написать глобальный хук для клавиатуры. Сам хук у меня уже есть, но не могу никак проверить введено ли ключевое слово. Например, если...

Хук на процесс - C++ WinAPI
Добрый день. Подскажите, как установить хук на отдельный процесс, к примеру на Mozilla Firefox. А если есть возможность, приведите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
01.03.2010, 21:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru