GTA Builder Форум

GTA Vice City => Программирование => Тема начата: Sektor от Октября 24, 2013, 04:06:39 pm

Название: Прототипы функций - Их вызов по адресу
Отправлено: Sektor от Октября 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. Так как там шире возможности и лучше оптимизация кода. Следовательно ваш код будет проще, а компилируемые приложения будут работать значительно быстрей.
Название: Re: Прототипы функций - Их вызов по адресу
Отправлено: xanser от Марта 09, 2014, 10:53:05 am
Получится ли такой же фокус с прототипами, содержащими __thiscall* ?
Название: Re: Прототипы функций - Их вызов по адресу
Отправлено: Sektor от Марта 09, 2014, 05:31:33 pm
Да, можно. Пример метода скинь, покажу как...
Название: Re: Прототипы функций - Их вызов по адресу
Отправлено: xanser от Марта 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;
Название: Re: Прототипы функций - Их вызов по адресу
Отправлено: Sektor от Марта 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.  
Название: Re: Прототипы функций - Их вызов по адресу
Отправлено: mike43842 от Марта 10, 2014, 04:25:09 pm
проще бы было новую студию поставить  ;D
Название: Re: Прототипы функций - Их вызов по адресу
Отправлено: xanser от Марта 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, может в старых версиях его так просто нельзя объявлять, а нужно подробно расписать? Или все, это тупик?
Название: Re: Прототипы функций - Их вызов по адресу
Отправлено: Sektor от Марта 10, 2014, 08:22:13 pm
Честно не знаю про старые студии, ну по пробуй прототип сделать:

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

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