GTA Vice City > Программирование
Прототипы функций - Их вызов по адресу
Sektor:
Иногда бывает, что у не которых программистов есть старые версии Visual C++. По этому в отсутствие оператора auto, могут возникнуть проблемы при компиляции. Для этого рассмотрим пример
1. Вариант (Современный способ вызова)
--- Код: C++ ---auto _spawnCarAtPlayerLocation = (void (__cdecl*)(signed int modelIndex))0x04AE8F0;
2. Вариант (Старинный способ вызова)
--- Код: C++ ---void (__cdecl *_spawnCarAtPlayerLocation)(signed int modelIndex) = (void (__cdecl*)(signed int modelIndex))0x04AE8F0;
3. Вариант (Старинный способ вызова - укороченный)
--- Код: C++ ---void (__cdecl *_spawnCarAtPlayerLocation)(signed int) = (void (__cdecl*)(signed int))0x04AE8F0;Фишка в том, что нет имен у параметров.
Теперь дам важный совет, лучше использовать самые новейшие версии MSVC. Так как там шире возможности и лучше оптимизация кода. Следовательно ваш код будет проще, а компилируемые приложения будут работать значительно быстрей.
xanser:
Получится ли такой же фокус с прототипами, содержащими __thiscall* ?
Sektor:
Да, можно. Пример метода скинь, покажу как...
xanser:
Например, из последних уроков
--- Код: C++ ---auto CText__locate = (wchar_t *(__thiscall*)(CText *, char *entryName))0x0584F30;
--- Код: C++ ---auto CTexture__draw = (void (__thiscall*)(CTexture *, RwRect *posInfo, RwRGBA *v1_color))0x00578710;
Sektor:
Вот таким образом, все просто на самом деле:
--- Код: C++ ---wchar_t * (__thiscall* CText__locate)(CText *, char *entryName) = (wchar_t * (__thiscall*)(CText *, char *entryName))0x0584F30;
и вот:
--- Код: C++ ---void (__thiscall* CTexture__draw)(CTexture *, RwRect *posInfo, RwRGBA *v1_color) = (void (__thiscall*)(CTexture *, RwRect *posInfo, RwRGBA *v1_color))0x00578710;
Навигация
Перейти к полной версии