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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Отследить изменение памяти сторонним процессом http://www.cyberforum.ru/cpp/thread1241864.html
Есть основное приложение1. Есть приложение2, которое считывает и изменяет его память. Надо отследить адреса, действие(чтение или запись), значение до и после действия. Куда копать?
C++ Adobe PDF Library (APDFL) - поместить в формируемый документ картину формата PNG Всем привет! Данная тема, возможно, не вполне подходит для данного раздела, поскольку вопрос, преимущественно имеет отношение к API Adobe PDF, конкретнее, к плюсовому API. Я пишу с использованием этой библиотеки от datalogics некоторое API для формирования PDF-документов. Сбился с ног, пытаясь запихать в формируемый документ (программно, разумеется) картину формата PNG. С JPEG проблем нет,... http://www.cyberforum.ru/cpp/thread1241863.html
Электронная подпись+работа с сертификатами C++
Здравствуйте!дали задание,саму суть понял,не могу разобраться,как начать писать программу.помогите кто чем может. Вот само задание: Разработать приложение - утилиту командной строки, или с графической оболочкой (на выбор). Утилита должна решать следующие задачи: 1. По серийному номеру находить нужный сертификат из хранилища MY 2. Выводить на экран информацию о владельце, сроке действия, и об...
Освобождение динамически созданных переменных (2-ого уровня) C++
И так, продолжу старую тему про динамику. На этот раз есть вот что: #include <iostream> #include <stdio.h> #include <conio.h> #include <math.h> using namespace std;
C++ Как правильно собрать ICU для g++ под Windows? http://www.cyberforum.ru/cpp/thread1238301.html
Не получается собрать ICU для компилятора g++ 4.8.2. Делаю через MSYS. Мои команды:cd D:/Temp/icu/source ./runConfigureICU MinGW --prefix=D:/Temp/dist --enable-static --disable-shared Всегда получаю одно и тоже самое:configure: error: cannot run C compiled programs Как правильно собрать? Делал по этому туториалу: Compiling ICU with MinGW
C++ Как из Wav файла получить комплексные значения для быстрого преобразования Фурье? Пишу программу для вывода спектра Wav файла Беру данные из Wav файла, прочел шапку, дошел до самих значений. Как понимаю это амплитудные значения. Дабы получить спектр, нужно использовать комплексные значения (БПФ). Тут вопрос, как из значений получить комплексные? Где то нашел, что значения нужно присвоить Вещественным, а комплексным присвоить 0. Так ли это? Если нет, то опишите для тех кто в... подробнее

Показать сообщение отдельно
DrOffset
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
19.08.2014, 22:19     Альтернативный вызов функции
Izual, Для настоящей динамики у нас должно быть динамическое окружение. С шаблонами мы так или иначе остаемся в рамках строгой типизации. Т.е. по настоящему динамичен будет только тот самый первый вариант, с VM (Virtual Machine) внутри нашей программы (которую реализует эта библиотека).
Есть высказывание, что "любую задачу можно решить увеличением уровня абстракции, кроме задачи слишком большого числа уровней абстракций". В данном случае именно это и есть единственное решение. Мы вынуждены организовать динамическую систему (новый уровень абстракции, по сравнению с самим языком С++) внутри нашей программы, чтобы она во время работы приложения, обеспечивала нужную нам функциональность - в частности реализовать загрузку допустимых прототипов из файла.

С другой стороны, так ли нужна тебе эта динамика? Может просто ограничиться возможность задания прототипа "по месту", что, собственно, у нас почти получилось? А возвращаемое значение можно и так обыграть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
template<typename R, typename ...Args>
R call(FARPROC fun, Args ... args)
{
    using func_type = R( __stdcall *)(Args...); // выведем тип функции по ее аргументам
    return ((func_type)fun)( args... );
}
 
int main()
{
    char fn[] = "MessageBoxA";
    int res = 0;
    HMODULE hMod = LoadLibraryA ( "user32.dll" );
    if ( !hMod )
        cout << "Library not loaded" << endl;
    else
    {
        FARPROC me = GetProcAddress( hMod, fn );
        if ( !me )
            cout << "Function not loaded" << endl;
        else
        {
            res = call<int>(me, (HWND)NULL, "hi", "message", (UINT)NULL );
            cout << res << endl;
        }
        FreeLibrary ( hMod );
    }
    return 0;
}
Всяческие boost::any - это хорошо, но опять же работать будет только в системе, где это централизованное, общее решение для всех вызовов. Мы не можем просто скастить функцию, которая на самом деле возвращает int к прототипу, который возвращает any. any - это класс, и он должен быть соответствующим образом сконструирован, а волшебным образом в нем не окажется возвращаемое значение, например, записанное в eax функцией из dll.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru