GTA Vice City > Программирование

Прототипы функций - Их вызов по адресу

(1/2) > >>

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;  

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии