Автор Тема: Прототипы функций - Их вызов по адресу  (Прочитано 3214 раз)

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Прототипы функций - Их вызов по адресу
« : Октябрь 24, 2013, 04:06:39 pm »
Иногда бывает, что у не которых программистов есть старые версии Visual C++. По этому в отсутствие оператора auto, могут возникнуть проблемы при компиляции. Для этого рассмотрим пример

1. Вариант (Современный способ вызова)

Код: C++
  1. auto _spawnCarAtPlayerLocation = (void (__cdecl*)(signed int modelIndex))0x04AE8F0;
  2.  

2. Вариант (Старинный способ вызова)

Код: C++
  1. void (__cdecl *_spawnCarAtPlayerLocation)(signed int modelIndex)  = (void (__cdecl*)(signed int modelIndex))0x04AE8F0;

3. Вариант (Старинный способ вызова - укороченный)

Код: C++
  1. void (__cdecl *_spawnCarAtPlayerLocation)(signed int)  = (void (__cdecl*)(signed int))0x04AE8F0;
Фишка в том, что нет имен у параметров.

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

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Прототипы функций - Их вызов по адресу
« Ответ #1 : Март 09, 2014, 10:53:05 am »
Получится ли такой же фокус с прототипами, содержащими __thiscall* ?

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Прототипы функций - Их вызов по адресу
« Ответ #2 : Март 09, 2014, 05:31:33 pm »
Да, можно. Пример метода скинь, покажу как...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Прототипы функций - Их вызов по адресу
« Ответ #3 : Март 10, 2014, 07:04:35 am »
Например, из последних уроков

Код: C++
  1. auto CText__locate = (wchar_t *(__thiscall*)(CText *, char *entryName))0x0584F30;

Код: C++
  1. auto CTexture__draw =  (void (__thiscall*)(CTexture *, RwRect *posInfo, RwRGBA *v1_color))0x00578710;

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Прототипы функций - Их вызов по адресу
« Ответ #4 : Март 10, 2014, 03:35:27 pm »
Вот таким образом, все просто на самом деле:
Код: C++
  1. wchar_t * (__thiscall* CText__locate)(CText *, char *entryName)  = (wchar_t * (__thiscall*)(CText *, char *entryName))0x0584F30;

и вот:


Код: C++
  1. void (__thiscall* CTexture__draw)(CTexture *, RwRect *posInfo, RwRGBA *v1_color) = (void (__thiscall*)(CTexture *, RwRect *posInfo, RwRGBA *v1_color))0x00578710;
  2.  
« Последнее редактирование: Март 10, 2014, 03:40:33 pm от Sektor »

Оффлайн mike43842

  • Прохожий
  • *
  • Сообщений: 110
  • Репутация: +1/-0
    • mike43842
    • Просмотр профиля
    • lol
Re: Прототипы функций - Их вызов по адресу
« Ответ #5 : Март 10, 2014, 04:25:09 pm »
проще бы было новую студию поставить  ;D

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Прототипы функций - Их вызов по адресу
« Ответ #6 : Март 10, 2014, 07:57:42 pm »
Возможно даже не проще, а единственный выход. Новая студия-то есть, просто некоторые исходники написаны еще в 2006 году и на новой студии уже не компилируются, что казалось бы странным, хотя может и не странно, а просто изменились некоторые стандарты. Исходники не все мои, поэтому особой радости их переписывать пока нет.
Все бы хорошо, да только после:

Код: C++
  1. class CText;
  2. wchar_t * (__thiscall* CText__locate)(CText *, char *entryName)  = (wchar_t * (__thiscall*)(CText *, char *entryName))0x0584F30;

получается:

Код: C++
  1. error C4234: nonstandard extension used : '__thiscall' keyword reserved for future use

Это для 6-й студии, с которой все начиналось, где-то попадалось что такое заработает, начиная только с 8-й. Но может быть тут проблема еще с самим классом CText, может в старых версиях его так просто нельзя объявлять, а нужно подробно расписать? Или все, это тупик?

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Прототипы функций - Их вызов по адресу
« Ответ #7 : Март 10, 2014, 08:22:13 pm »
Честно не знаю про старые студии, ну по пробуй прототип сделать:

Код: C++
  1. class CText;

Не рекомендую старые студии, там оптимизатор куда хуже и качество такого кода, естественно ниже...