Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> c++ массив stdcall функций 
V
    Опции темы
ni1
Дата 30.6.2014, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.6.2014

Репутация: нет
Всего: нет



c++ массив stdcall функций с переменным числом параметров. Как это сделать?

В C это делается так:
Код

typedef int  (__stdcall *func)();
func my_array[] = {0x11111111, 0x22222222, 0x33333333};

//вызов функций
my_array[0](0, 1, 2)
my_array[0](0, 1, 2, 3, 3)
my_array[1](0, 1, 2)


C++ никак не хочет вызывать функции с необъявлеными параметрами. Есть сделать так
Код

typedef int  (__stdcall *func)(...);

то компилятор считает что функция cdecl.

Все найденые примеры с одинаковым числом параметров или cdecl, а мне нужно stdcall. Может какие настройки в компиляторе есть, отключающие проверку?
PM MAIL   Вверх
bems
Дата 30.6.2014, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



никак. в stdcall вызываемая функция чистит стек, это не сочетается с переменным числом параметров. 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ni1
Дата 30.6.2014, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.6.2014

Репутация: нет
Всего: нет



Понятно. С++ ###, С рулит.

А если число параметров не перменное? 3 функции, изветстно что 3 - 5 - 1 параметров у них.
PM MAIL   Вверх
bems
Дата 30.6.2014, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(ni1 @  30.6.2014,  15:00 Найти цитируемый пост)
С++ ###, С рулит

а что, в С variadic функция может быть stdcall? это новость

Цитата(ni1 @  30.6.2014,  15:00 Найти цитируемый пост)
А если число параметров не перменное? 3 функции, изветстно что 3 - 5 - 1 параметров у них. 
то для каждой сигнатуры тебе нужен отдельный тип и соответственно в один массив это не запихнуть. 

ну это всё если тебе нужны именно указатели на функции и если ты хочешь при этом сохранить проверку типов


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ni1
Дата 30.6.2014, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.6.2014

Репутация: нет
Всего: нет



Цитата(bems @  30.6.2014,  18:31 Найти цитируемый пост)
а что, в С variadic функция может быть stdcall? это новость

"C" код в первом посте работает как надо.

Без проверок типов, просто вызов stdcall функций по адресам из массива, не копируя эти адреса куда-то еще. Неужели C++ не может справиться с такой простой задачей?
PM MAIL   Вверх
bems
Дата 30.6.2014, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(ni1 @  30.6.2014,  19:42 Найти цитируемый пост)
"C" код в первом посте работает как надо.

боюсь, это означает что компилер С молча сделал из функции cdecl. потому что stdcall не бывает variadic

Цитата(ni1 @  30.6.2014,  19:42 Найти цитируемый пост)
Без проверок типов, просто вызов stdcall функций по адресам из массива, не копируя эти адреса куда-то еще. Неужели C++ не может справиться с такой простой задачей? 

легко smile делай массив PVOID и при вызове касть к нужному типу функции



--------------------
Обижено школьников: 8
PM MAIL   Вверх
ni1
Дата 30.6.2014, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.6.2014

Репутация: нет
Всего: нет



Цитата(bems @  30.6.2014,  19:57 Найти цитируемый пост)
боюсь, это означает что компилер С молча сделал из функции cdecl. потому что stdcall не бывает variadic


у компилера микрософта, значит, бывает:
Код

    push    ebp
    mov    ebp, esp
    push    2
    push    1
    push    0
    call    DWORD PTR _my_array
    push    3
    push    3
    push    2
    push    1
    push    0
    call    DWORD PTR _my_array
    push    2
    push    1
    push    0
    call    DWORD PTR _my_array+4
    pop    ebp
    ret    0




PM MAIL   Вверх
bems
Дата 30.6.2014, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



ааа
так это не variadic. он просто вызывал как stdcall то что дали, не проверяя ничего. короч этим ты обязан слабой типизации сей, а не переменному числу параметров, его-то тут и нет


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1030 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.