Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трюк, возможно ли это? 
:(
    Опции темы
vaddsm
Дата 7.9.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Цитата

ясен пень, это стандарные дейстивия, необходимые для возврата из процедуры.


Возможна реализация компилятора, в которой данне действия будут выполнятся иначе и тогда код в на таком компиляторе станет не деиспособен, вобщем то на VS он тоже пока не работает, но погодите еще немного, сейчас внесем необходимые инструкции .
PM MAIL   Вверх
vinter
Дата 7.9.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  7.9.2008,  20:11 Найти цитируемый пост)
__fastcall () - насколько я понял это перегрузка оператора инициализации объекта в борланде.

так погоди, тут вызывается конструктор. Что еще за оператор инициализации? smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 7.9.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vinter @  7.9.2008,  19:30 Найти цитируемый пост)
ак погоди, тут вызывается конструктор. Что еще за оператор инициализации? smile  

конструктор вызовется и без ()


--------------------
PM MAIL WWW   Вверх
vinter
Дата 7.9.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  7.9.2008,  20:32 Найти цитируемый пост)
конструктор вызовется и без ()

естественно, () это необязательная добавка. Впервые слышу об операторах инициализации.


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 7.9.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vinter @  7.9.2008,  19:35 Найти цитируемый пост)
естественно, () это необязательная добавка.

Ну вот судя по всему борланд и положил на нее глаз ))



--------------------
PM MAIL WWW   Вверх
vaddsm
Дата 7.9.2008, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Цитата

ясен пень, это стандарные дейстивия, необходимые для возврата из процедуры.


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


Сделал реализацию совместимую с VS и BCB, сейчас код выложу. Да комиляторозависимо, но это всеголишь интерфес к библиотеке, сама либа представлена набором функций, и если пользователь не может в силу несовместимости пользоваться простой конструкций, он сможет работать с функциями напрямую. 

Это сообщение отредактировал(а) vaddsm - 7.9.2008, 20:45
PM MAIL   Вверх
mes
Дата 7.9.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vaddsm @  7.9.2008,  20:44 Найти цитируемый пост)
Таки уж и стандартные? Стандарт - это язык, а то как, тот или иной производитель компилятора, представляет его в машином коде, это сугубо его личное дело. 

Стандарты бывают разные. В данном случае шла речь о стандарте соглашений вызова.
тут немного замутняет картину то, что используется __fastcall - a oно компиляторозависимое соглашение. 



--------------------
PM MAIL WWW   Вверх
vaddsm
Дата 8.9.2008, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Ужос ___х!  smile  Дело в том что конвенции эти судя по тому, что каждый компилятор интерпритирует их в вольной форме для методов, разработаны для внешних функций а не для методов класса. Если понятно о чем я говорю... Например, стандартный __cdecl, родной для C, борланд помещает аргументы в стек, последним в стек идет this, в тоже время Microsoft, разместив аргументы в стеке, this передает через ecx. Для __stdcall соответственно. Почему об это я заговорил, по тому, что от конвенции зависит где именно в стеке будет this, после EBP или до. Тут все не так просто, развертывая стек надо еще смотреть, а что именно за метод по вызову. Сейчас дорабатываю.
PM MAIL   Вверх
vaddsm
Дата 8.9.2008, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Точто могу сказать одно, на консрукторы  в VS конвенции не распростроняются, что непеши всегда аргументы в стек, this в ecx.

Это сообщение отредактировал(а) vaddsm - 8.9.2008, 02:15
PM MAIL   Вверх
mes
Дата 8.9.2008, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vaddsm @  8.9.2008,  01:59 Найти цитируемый пост)
конвенции эти судя по тому, что каждый компилятор интерпритирует их в вольной форме для методов, разработаны для внешних функций а не для методов класса

 smile ага, понятие метод есть только на уровне языка, в объектном файле они (методы) представлены в виде функций.


Это сообщение отредактировал(а) mes - 8.9.2008, 02:54


--------------------
PM MAIL WWW   Вверх
dumb
Дата 8.9.2008, 04:21 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



vaddsm, приведенный тобой кривой костыль не только непонятен/несопровождаем, но и зависим не только от компилятора, но и от опций, а именно: от stack frames и от оптимизации. выключи frames(а в release они по дефолту выключены) или включи оптимизацию - и аля-улю.
косяк, кстати:
Цитата(vaddsm @  7.9.2008,  18:16 Найти цитируемый пост)

...
   TMyLib *Lib;
   TMyLibInterface()
   {
    lpCallMethod lpfun = ClassName::CallMethod;
    TMyLib *Lib = new TMyLib(*(DWORD *)&lpfun);
   };
   ~TMyLibInterface()
   {
    delete Lib;
...


Цитата(vaddsm @  7.9.2008,  18:16 Найти цитируемый пост)
Прежде всего давайте рассмотри начало любой функции описанной средствами языка c++ в машинном коде:
Код
00426100 55                push ebp
00426101 8BEC            mov ebp,esp

как уже было упомянуто, формирование фрэймов в стэке зависит от опции(и от компилера).

Цитата(vaddsm @  7.9.2008,  18:16 Найти цитируемый пост)
Благодаря этому правилу мы всегда можем раскрутить стек и дойти до начала стека интересующей нас функции.

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

Цитата(vaddsm @  7.9.2008,  18:16 Найти цитируемый пост)
Но так, как для выполнения этой операции нам потребуется один регистр, необходимо позаботится о том, чтобы его первоначальное значение не было утеряно

в данном случае никакой необходимости в этом нет.

Цитата(vaddsm @  7.9.2008,  18:16 Найти цитируемый пост)
Код
mov  eax, [eax-0x04]

Но в данном случае мы берем значение не из ячейки стека, в которой находится очередной EBP, а на 4 байта выше, именно туда функция – метод класса помещает указатель.

...если отключена оптимизация. и это в билдере, не где-то. где-то будет еще веселей.

"боги", "гуру"... smile

Цитата(vaddsm @  8.9.2008,  02:59 Найти цитируемый пост)
Почему об это я заговорил, по тому, что от конвенции зависит где именно в стеке будет this, после EBP или до.
от соглашения зависит будет ли this помещен в стэк(до вызова метода) или нет. "после" - это особенности процесса компиляции.

Цитата(vaddsm @  8.9.2008,  02:59 Найти цитируемый пост)
Тут все не так просто, развертывая стек надо еще смотреть, а что именно за метод по вызову. Сейчас дорабатываю.
пелена начинает спадать...

Цитата(vaddsm @  7.9.2008,  21:44 Найти цитируемый пост)
и если пользователь не может в силу несовместимости пользоваться простой конструкций, он сможет работать с функциями напрямую.
чего ему и пожелаем, чтобы не ловить потом необъяснимые косяки.

PM MAIL   Вверх
vaddsm
  Дата 8.9.2008, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



dumb, Спасибо, сейчас по пунктам отработаю приведенные вами замечания!

Вот пример, у меня работает при любом виде конструктора TAnyClass в средах BCB и VS. С опциями оптимизации, я пока не проработал. 

Код


class TMyLib
{

 public:

 void __fastcall DoSomeStuff(char *Ptr);

 TMyLib(DWORD dwCallAddr);
 ~TMyLib();

};

void __fastcall TMyLib::DoSomeStuff(char *Ptr)
{
 wsprintf(Ptr, "Action fired~!");
};


TMyLib::TMyLib(DWORD lpfn)
{

 __asm
 {

  push eax
  push ecx
  push ebx

  mov  eax, [ebp]  
  mov  eax, [eax]
  mov  ebx, [eax+0x04]
  mov  ebx, [ebx-0x08]
  xor  ecx, ecx
  mov  cl, bl

  cmp  ecx, 0x8B
  jnz  label_stdcall

  mov  ebx, [eax-0x04]
  jmp  label_call

  label_stdcall:

  mov  ebx, [eax+0x08]

  label_call:

  push ebx
  call lpfn
  pop  ebx

  pop  ebx
  pop  ecx
  pop  eax

 }

};

TMyLib::~TMyLib()
{

};

#define TOOL_TABLE_BEGIN(ClassName)                            \
                                                               \
 class TMyLibInterface                                         \
 {                                                             \
  public:                                                      \
   typedef void (__cdecl ClassName::*lpCallMethod)();          \
   TMyLib *Lib;                                                \
   TMyLibInterface()                                           \
   {                                                           \
    lpCallMethod lpfun = ClassName::CallMethod;                \
    Lib = new TMyLib(*(DWORD *)&lpfun);                        \
   };                                                          \
   ~TMyLibInterface()                                          \
   {                                                           \
    delete Lib;                                                \
   }                                                           \
 } MyLibInterface;                                             \
                                                               \
 public:                                                       \
                                                               \
 void __cdecl CallMethod()                                     \
 {                                                             
#define DO_ACTION(WITH) MyLibInterface.Lib->DoSomeStuff(WITH);
#define TOOL_TABLE_END                                         \
 };                                                            \
                                                               \
 protected:





class TAnyClass //: public TClass2
{


 protected:

 char message[50];

 TOOL_TABLE_BEGIN(TAnyClass)
 DO_ACTION(message)
 TOOL_TABLE_END

 public:

 TAnyClass ()
 {
  MessageBox(0, message, "Trick! ;)))", 0);
 };

 ~TAnyClass (){};

};



...

TAnyClass *x =  new TAnyClass();

Коменты будут.


P.S Права на чтение сегмента памяти не выставил, в следующем варианте будут.

Добавлено @ 04:44
В Борланде работает при любых опциях оптимизации. А в релизе пока нет.

Это сообщение отредактировал(а) vaddsm - 8.9.2008, 04:48
PM MAIL   Вверх
vaddsm
Дата 8.9.2008, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



 smile ЛАЖА  smile 
PM MAIL   Вверх
Lazin
Дата 8.9.2008, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



блин, так и не понял, зачем пихать ук. на функцию в DWORD? 
вместо
Код

TMyLib::TMyLib(DWORD lpfn)
{
 __asm
 {
  push eax
  push ecx
  push ebx
  mov  eax, [ebp]  
  mov  eax, [eax]
  mov  ebx, [eax+0x04]
  mov  ebx, [ebx-0x08]
  xor  ecx, ecx
  mov  cl, bl
  cmp  ecx, 0x8B
  jnz  label_stdcall
  mov  ebx, [eax-0x04]
  jmp  label_call
  label_stdcall:
  mov  ebx, [eax+0x08]
  label_call:
  push ebx
  call lpfn
  pop  ebx
  pop  ebx
  pop  ecx
  pop  eax
 }

вполне прокатит
Код

template<class T>
TMyLib::TMyLib(T& obj)
{
    obj.CallMethod();
 }

ведь ты вегда вызываешь один и тот-же метод в конструкторе, кстати, что будет, если пользователь в своем классе, захочет создать ф-ю с именем CallMethod? smile

Добавлено через 1 минуту и 39 секунд
Код

   TMyLib *Lib;                                                \
   TMyLibInterface()                                           \
   {                                                           \
    Lib = new TMyLib(*this);                        \
   }; 


PM MAIL Skype GTalk   Вверх
vaddsm
  Дата 8.9.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Lazin, CallMethod где? ГИДЕ? Он в TAnyClass, а ты this передаеш какой? На TMyLibInterface.

Цитата

если пользователь в своем классе, захочет создать ф-ю с именем CallMethod? 


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

void hey_guy_do_never_try_to_name_method_like_this_f_king_long_method_name(void);

 smile 

Короч, универсального решения той задачи, которую я ставил изначально нет, есть частные вполне рабочие реализации, но в жизни совершенно неприменимые. Так, что в утиль. А лучше отдельной статьёй как делать ненадо. Хотя я сейчас еще гляну, как коверкается код при оптимизации, мож че придумаю и на этот раз  smile )
PM MAIL   Вверх
Страницы: (8) Все « Первая ... 4 5 [6] 7 8 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4058 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.