Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > c++ массив stdcall функций


Автор: ni1 30.6.2014, 13:06
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. Может какие настройки в компиляторе есть, отключающие проверку?

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

Автор: ni1 30.6.2014, 15:00
Понятно. С++ ###, С рулит.

А если число параметров не перменное? 3 функции, изветстно что 3 - 5 - 1 параметров у них.

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

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

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

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

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

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

Без проверок типов, просто вызов stdcall функций по адресам из массива, не копируя эти адреса куда-то еще. Неужели C++ не может справиться с такой простой задачей?

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

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

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

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

Автор: ni1 30.6.2014, 21:33
Цитата(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




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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)