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

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 518
  • Репутация: +34/-0
    • Просмотр профиля
Иногда бывает, что у не которых программистов есть старые версии 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

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 550
  • Репутация: +74/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Получится ли такой же фокус с прототипами, содержащими __thiscall* ?

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 518
  • Репутация: +34/-0
    • Просмотр профиля
Да, можно. Пример метода скинь, покажу как...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 550
  • Репутация: +74/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Например, из последних уроков

Код: 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

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 518
  • Репутация: +34/-0
    • Просмотр профиля
Вот таким образом, все просто на самом деле:
Код: 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
проще бы было новую студию поставить  ;D

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 550
  • Репутация: +74/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Возможно даже не проще, а единственный выход. Новая студия-то есть, просто некоторые исходники написаны еще в 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

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 518
  • Репутация: +34/-0
    • Просмотр профиля
Честно не знаю про старые студии, ну по пробуй прототип сделать:

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

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