Форум программистов, компьютерный форум 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
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
20.08.2014, 13:58
Цитата Сообщение от Izual Посмотреть сообщение
мне по поводу первого вопроса тоже говорили тоже самое
Ничего из того, что говорили в первых сообщениях, решение StailGot не опровергло. Все решения, в том числе решение StailGot, крутятся вокруг статической типизации. Шаблон - это генератр кода, для разного количества типов или аргументов будет сгенерирован свой код, своя функция call. Вся эта механика работает на этапе компиляции, т.е. мы снова вернулись к статической типизации. В шаблоне в общем случае возвращаемый тип автоматически не вывести, поэтому приходится писать его явно. Еще раз, это очень важно, чтобы ты понял - решение StailGot подчиняется законам статической типизации, работает только на этапе компиляции и в динамике работать не будет.
В языке С++ и С нет такого механизма, который мог бы по известному в динамике списку аргументов положить параметры на стек и вызвать некую процедуру по адресу, а потом по известному в динамике типу возвращаемого значения адекватным образом получить возврат. Просто нет. Этот механизм надо делать. Можно использовать уже готовые решения, навроде того, что я уже предлагал. В принципе - это полностью решает все вопросы, но ты от чего-то это решением не считаешь. Ладно, хорошо. Тогда это можно сделать вручную с использованием встроенного ассемблера или написать отдельный модуль на ассемблере. Естественно работать будет для конкретного компилятора и конкретной платформы, т.к. встроенный ассеблер и вообще ассемблерные инструкции различаются на разных компиляторах и архитектурах соответственно.
Если оставаться только в рамках языка, то любые динамические решения должны быть согласованы во всей системе. Очевидно, что WinAPI ничего не знает ни про any, ни про type_info, т.к. написано на С. И сами функции WinAPI не рассчитанны на динамическую типизацию из коробки, поэтому подчиняются все тем же законам статической типизации и предполагают, что компилятор сгенерирует код по заданному прототипу. Вот если бы функции сразу возвращали плиморфные типы или типы, или что-то вроде твоих union, то тогда можно было бы говорить о каким-то мыслимом обобщении в динамике без участия неязыковых средств.

Теперь я бы хотел вернуться к исходной задаче. Ведь проблема, которую ты пытался этим решить, на самом деле не стоит такого решения. Если бы она стоила такого решения, то это решение давно было бы у всех на виду и все бы им пользовались. Но никто им не пользуется. Но раз уж тебе хочется просто не писать вручную приведение к нужным прототипам, и ты уже согласился на использование С++11, то можно ведь и так поступить и остаться при этом в рамках типизации С++, и не писать ужасных велосипедов на тему динамического вызова:
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
29
30
31
32
template <typename F>
F GetProcAddress(HMODULE hMod, char const * name, F f = FARPROC())
{
    return F(::GetProcAddress(hMod, name));
}
 
#define GetProcAddressProto(hMod, f) \
        GetProcAddress((hMod), (#f), (f))
 
int main()
{
    int res = 0;
    HMODULE hMod = LoadLibraryA("user32.dll");
    if ( !hMod )
        cout << "Library not loaded" << endl;
    else
    {
        // так:
        auto me = GetProcAddressProto(hMod, MessageBoxA);
        // или так:
        //auto me = GetProcAddress(hMod, "MessageBoxA", MessageBoxA);
        if ( !me )
            cout << "Function not loaded" << endl;
        else
        {
            res = me(NULL, "hi", "message", NULL);
            cout << res << endl;
        }
        FreeLibrary ( hMod );
    }
    return 0;
}
Решение строится на том, что прототип и так описан в заголовке winuser и мы можем использовать его для получения типа указателя на функцию. А макрос убирает лишнюю писанину.

auto - это вывод типа переменной в С++11 исходя из возвращаемого выражением значения, в данном случае F в шаблоне функции (в F реальный прототип).
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru