Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
#1

Альтернативный вызов функции - C++

15.08.2014, 10:44. Просмотров 2511. Ответов 66
Метки нет (Все метки)

1. Интересует метод вызова функции через указатель(или по другому).
2. Интересует метод взятия кол-ва аргументов функции и их типов, а так же тип возвращяемого значения.

По второму пункту вообще ничего не нашёл, а по первому есть некоторые вопросы.
C++
1
2
3
4
5
6
7
8
9
#include "FTD2XX.h" // библиотека от FTDI
typedef FT_STATUS (*pFT_Open) (int, FT_HANDLE *); // тип данных "функция FT_OPEN"
 
HMODULE hMod = LoadLibrary ("FTD2XX.dll"); // загрузка библиотеки - д. б. не ноль
pFT_Open pOpen = GetProcAddress (hMod, "FT_Open"); // получили адрес функции - также д. б. не ноль
 
FT_STATUS st = pOpen (0, &hDev);    // вызываем функцию
 
FreeLibrary (hMod); // закрыли библиотеку
Нашёл вот такой вот вызов функции через строку названия функции "FT_Open". Меня интересует, если не создавать DLL, то можно ли как то вызвать подобным способом стандартную функцию (например из winuser.h)?

Ещё заинтересовало такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
void check(char *a, char *b, int (*cmp) (const char *, const char *));
int main(void)
{
char s1 [80], s2[80];
int (*p) (const char*, const char*);
p = strcmp; /* получение адреса strcmp() */
gets(s1);
gets (s2);
check(s1, s2, p);
return 0;
}
 
void check (char *a, char *b, int (*cmp) (const char *, const char *))
{
printf("Testing for equality.\n");
if(!(*cmp) (a, b)) printf("Equal");
else printf("Not equal");
}
Однако тут явно указывается кол-во членов и их тип :
C++
1
int (*p) (const char*, const char*);
Что мне не подходит, можно как то это преодолеть? И ещё меня не устраивает что надо явно писать:
C++
1
p = strcmp;
А не строковой (char *) переменной, что дало бы возможность динамики (ну именно это в конечном итоге меня и интересует).

П.С. Если это возможно, приводите пожалуйста примеры без использования STL и классов, а более приближенными к Си методами.

Вообще по поводу пункта 2: подумалось, что если реализовать пример1, то нужен будет список функций, который я в принципе могу хранить в txt фале вместе с кол-вом аргументов и возвращяемым значением, хотя это будет тупое копирование строк из .h файлов, к примеру из winuser будут подобия:
C++
1
WINUSERAPI LRESULT WINAPI SendMessageA(HWND,UINT,WPARAM,LPARAM);
От сюда я могу "запарсить" и искомое извлечь для выполнения операции. Не думаю что будет смысл париться над пунктом2, т.к. игра не стоит свеч, значит стаётся открытым вопрос первый.

Добавлено через 29 минут
Узнал что это:
C++
1
typedef FT_STATUS (*pFT_Open) (int, FT_HANDLE *);
являет прототипом функции. В общем вот эту инициализацию прототипа можно обойти? Т.е. подразумеваю что например у меня будет динамический массив с переменными, после парсинга я получу типы, и согласно им - заполню массив. Далее если бы можно было бы реализовать вызов GetProcAddress с сылкой на массив, то хотелось бы чтоб автоматически передавались в аргументы значения массива от [1] и до кол-ва аргументов ( [0] аргумент думаю будет идти как возвращяемое значение функции)... (может как то можно использовать в данном случае переменное кол-во аргументов в функции?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2014, 10:44     Альтернативный вызов функции
Посмотрите здесь:

C++ Вызов функции
C++ Вызов функции
C++ Вызов функции в C++
C++ Вызов функции!
Вызов функции в возврате значения функции C++
C++ Вызов функции
Вызов функции C++ Builder
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.08.2014, 14:36     Альтернативный вызов функции #61
Цитата Сообщение от Izual Посмотреть сообщение
Очень смешно... ну прям упасть и не встать. ~ ~
это не смешно, перед вами тут бисер мечут...

Цитата Сообщение от Izual Посмотреть сообщение
Это далеко не всем надо, а я этим занимаюсь потому что мне нравится динамика и нравится программирование, ещё нравится Си. Но сидеть в статике я не хочу, потому и ищу выход из сложившейся ситуации.
вам нужен Objective-C и это не шутка
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
20.08.2014, 14:56     Альтернативный вызов функции #62
Я это рассказываю, чтобы ты смог отделить зерна от плевел, нельзя решать задачу на инструменте, не зная как этот инструмент работает.
Цитата Сообщение от Izual Посмотреть сообщение
Вот это эпик фэйл, представляю, программа работает на моём компе (win7 32бита). А на любом другом компе с теми же 32битами и win7 работать не будет - зачем такая программа тогда...
Я такого нигде не говорил. Собранная программа работать будет в пределах архитектуры (процессора). Т.е. если мы берем архитектуру x86, 32 бита, то работать будет везде, где есть x86, 32 бита. Работать (компилироваться) не будет, например для ARM или для MIPS, там другой ассемблер.
По поводу компилятора, опять же под "работать" подразумевалось - "во время компиляции". Т.е. под VS нам нужно писать один код, под GCC - другой и т.д. так как понятие "встроенный ассемблер" для каждого компилятора свое. Но уже скомпилированная программа работать будет в рамках архитектуры процесора на любой машине (в рамках заданной ОС).
Вот о чем я и говорил, я сказал некую вещь, а ты сразу "эпик фейл". Потому что ты меня не так понял. Поэтому я тебе и рассказываю все в подробностях, чтобы таких ситуаций не было. Нужно знать (и стремиться узнать) инструмент, на котором работаешь, досконально. Иначе это не работа, а шаманство: "тут повезло, там не повезло".

Цитата Сообщение от Izual Посмотреть сообщение
А какие то разсчитаны? Например функции из stdio.h?
Никакие в общем случае. С\С++ нужны прототипы для вызова.
Расчитаны на динамическую типизацию могут быть функции в модулях на питоне, например. Но там как раз выполняется правило, "вся система знает про динамику" (здесь подразумевается интерпретатор питона - это одна система, сторонние библиотеки, например WinAPI - другая). Как только нам из питона нужно будет вызвать функцию WinAPI, то он вынужден будет статически указывать все аргументы в соответсвии с нужными типами, т.к. на WinAPI стороне про питон и его типизацию никто не знает. Но питон может сделать это динамически, потому что сам работает (интерпретируется) в динамике, а С++ нет, потому что компиляция - это одно, а выполнение - совсем другое. На этапе компиляции дано гораздо большее количество информации, чем у нас есть на этапе выполнения. Ты никогда не думал почему так сложно восстанавливать исходный код из уже собранного исполняемого модуля на С++? И почему так просто получить исходный код обратно из байткода того же С#?

Цитата Сообщение от Izual Посмотреть сообщение
Предложенный вариант я так понимаю не сможет мне строку прочтённую из файла типа char* преобразовать в название функции так как это вы показали.
Не сможет, это вариация на тему уже предложенных вариантов с шаблонами.

Цитата Сообщение от Izual Посмотреть сообщение
...я же сказал что у меня в txt виде названия функций, т.е. в программе их не будет...
...Ещё раз повторю, задача строится на том чтобы описать вызовы тысяч функций через одну процедуру (я понимаю что я не правильно выражаюсь, но абстрактно смысл должен быть понятен).
Тогда я последнйи раз скажу, что в такой поставновке вопроса исключительно языковыми средствами эту задачу решить невозможно.

Добавлено через 2 минуты
Цитата Сообщение от Izual Посмотреть сообщение
DrOffset, ну серьёзно, ты же видиш что я хочу, зачем лишнее пишеш? Быт заел?
Я вижу и я тебе ответ дал еще на первой странице. Этот ответ покрывает 100% заявленных тобой требований, остальное - это твои проблемы уже
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
20.08.2014, 16:34  [ТС]     Альтернативный вызов функции #63
Цитата Сообщение от Jupiter Посмотреть сообщение
это не смешно, перед вами тут бисер мечут...
Аяяй, косвенно "личное оскорбление" Ну я предпочитаю чтоб мне указывали на недостатки, нежели смеялись за спинами, потому поясню. Если бы лица, которые отвечают в данной теме не видели бы мои предыдущие темы и посты, тем самым не знали бы мой -уровень, то ваша фраза была бы уместной. Я разцениваю ответы DrOffset'a как дар, ну возможно он иногда в дебри уходит, но в конечном итоге кое что из этого полезно, на русском думаю такую информацию не везде можно найти, а тут есть Так что используемая вами фраза не совсем корректна тут, потому как именно в том виде, в котором строятся ответы - достаточно просты, а потому учитываются (почти)все "но" и "если". Ну и из того что было сказано, я прогуглил по 100 запросов дабы вникнуть в общих чертах то о чём речь. (не везде, но там где это необходимо, в соответствии с временем и обстоятельствами)

Не по теме:

А вообще, могу с вами в личке по веданте пообщяться, чтоб вы не думали что я "просто так" создал тему.



Jupiter, вы бы лучше высказали своё мнение по поводу сложившейся задачи в рамках С++. (было бы более полезно, а то вот ваша фраза вызвала ненужные 10 строк коментария)

Цитата Сообщение от DrOffset Посмотреть сообщение
Но уже скомпилированная программа работать будет в рамках архитектуры процесора
На 64 битах не будет работать?
Цитата Сообщение от DrOffset Посмотреть сообщение
ответ дал еще на первой странице
Как один из выходов, но всего один... Да и я не уверен что ты на 100% знаеш С++ чтобы сказать наверняка что "нельзя".
Цитата Сообщение от DrOffset Посмотреть сообщение
Нужно знать (и стремиться узнать) инструмент
Много разного, лишнего, и не нужного (по крайней мере для меня и сейчас) есть в С++, чего я использовать не хочу в виду некоторых представлений о жизни и о сложившемся времени.

Не по теме:

Немного оффтопа: Вообще, слишком много чего в жизни есть из того что могло бы быть сделано, но его почему то нет. Очень много неразумного, люди например если бы не воевали то достигли бы куда большего, но почему то продолжают удовлетворять свои эгоистические потребности, не видя что за это плата будет в виде пекла. А почему лично я не хочу изучать некоторые вещи в программировании - просто потому что качества личности не позволяют этого делать (да и думаю что это не надо), именно по этому у каждого свои роли. Например не думаю что человек которому интересно капаться в недрах Си будет так же интересно капать картошку)) Я бы предпочёл например какие то идеи продвигать, так сказать автоматизация, которая бы могла дать людям больше свободного времени, чтобы они больше душой интересовались и вопросами вечности

ForEveR
20.08.2014, 16:59
  #64

Не по теме:

Izual, На 100% С++ не знает даже Страуструп... Так что...
Как бы то ни было, в рамках языков С/С++ НЕТ вариантов, чтобы сделать то, что вы хотите без виртуальной машины. Просто нет. Потому как язык для этого не предназначен.

Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,338
Записей в блоге: 11
20.08.2014, 17:00     Альтернативный вызов функции #65
Цитата Сообщение от Izual Посмотреть сообщение
Да и я не уверен что ты на 100% знаеш С++ чтобы сказать наверняка что "нельзя".
Необязательно знать все факты, достаточно знать правила.
Izual
20.08.2014, 17:31  [ТС]
  #66

Не по теме:

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Необязательно знать все факты, достаточно знать правила.
Разумно)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 18:45     Альтернативный вызов функции
Еще ссылки по теме:

Вызов функции в параметре другой функции C++
Функции в Assembler, вызов функции в C++ C++ Builder
C++ Вызов функции внутри другой функции с передачей локальной переменной по ссылке
C++ Вызов функции
вызов функции из под функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
20.08.2014, 18:45     Альтернативный вызов функции #67
Цитата Сообщение от Izual Посмотреть сообщение
На 64 битах не будет работать?
Будет, если не стремиться достичь обратного специально.

Добавлено через 35 минут
Цитата Сообщение от Izual Посмотреть сообщение
Да и я не уверен что ты на 100% знаеш С++ чтобы сказать наверняка что "нельзя".
Для того, чтобы сказать "нельзя" не нужно знать на 100%, достаточно иметь представление о законах.
Скажем так, я знаю достаточно, чтобы утверждать, что это сделать невозможно оставаясь в рамках С\С++.
На С\С++ можно написать язык (реализацию языка), который будет это уметь. Например язык Lua - написан на С, там как раз нет понятия прототип, в функцию можно передать сколько угодно аргументов и принять сколько угодно и какого угодно типа. Если мы попытаемся обратиться к аргументу которого нет, то просто получим NULL, а если мы попытаемся сделать с типом нечто, что с ним делать нельзя, то среда нам об этом сообщит. Там тоже VM, кстати.

Сходи на osdev.org и посмотри, там множество примеров, когда нельзя обойтись только средствами языка. Это не такая уж и редкость.

Кстати, Страуструп на одном из семинаров сказал, что знает С++ на 9 из 10.
Yandex
Объявления
20.08.2014, 18:45     Альтернативный вызов функции
Ответ Создать тему
Опции темы

Текущее время: 02:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru