Форум программистов, компьютерный форум 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
6922 / 4115 / 942
Регистрация: 30.01.2014
Сообщений: 6,910
16.08.2014, 17:45     Альтернативный вызов функции
Цитата Сообщение от Izual Посмотреть сообщение
Но в тесте 2 я уже не знаю куда копать.
Провел небольшое исследование. VS игнорирует stdcall для прототипа такого вида (причем на моей VS 2012 это происходит только в отладочной сборке).
Вот код:
Assembler
1
2
3
4
5
6
7
8
9
10
    mov esi, esp
    push    0
    push    OFFSET ??_C@_07ONPBMBOP@message?$AA@
    push    OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    push    0
    call    DWORD PTR _me$1[ebp]
    add esp, 16                 ; Проблема тут(!)
    cmp esi, esp
    call    __RTC_CheckEsp
    mov DWORD PTR _res$[ebp], eax
При stdcall вызове очистку стека производит вызываемая функция. Однако, как мы видим по коду, VS пытается произвести очистку еще раз, уже в нашем коде. Подробнее тут.
В общем, как я уже говорил, работающий во всех случаях вариант без асма (хотя бы без знания) сделать будет тяжело (или даже невозможно).

Добавлено через 34 минуты
Вот код, который гененирует VS в релизе (я вручную добавил дебажную проверку):
Assembler
1
2
3
4
5
6
7
8
9
    mov esi, esp ; for check
    push    0
    push    OFFSET ??_C@_07ONPBMBOP@message?$AA@
    push    OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    push    0
    call    eax
    cmp esi, esp  ; for check
    call    __RTC_CheckEsp ; for check
    mov esi, esp  ;  for check
Этот код не падает. Кстати mingw ведет себя корректно (учитывает stdcall у прототипа с ...), генерирует для твоего примера вот такой код:
Assembler
1
2
3
4
5
6
    mov DWORD PTR [esp+12], 0
    mov DWORD PTR [esp+8], OFFSET FLAT:LC4
    mov DWORD PTR [esp+4], OFFSET FLAT:LC5
    mov DWORD PTR [esp], 0
    call    eax
    sub esp, 16
Здесь видно, что у него немного иной подход к изменению esp (когда кладем параметры на стек, то esp не меняется, зато потом, после вызова, мы корректируем его на правильное значение один раз).
Я переписал код для VS таким же способом и вставил проверку:
Assembler
1
2
3
4
5
6
7
8
9
10
    mov esi, esp ; for check
    mov DWORD PTR [esp+12], 0
    mov DWORD PTR [esp+8], OFFSET ??_C@_07ONPBMBOP@message?$AA@
    mov DWORD PTR [esp+4], OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    mov DWORD PTR [esp], 0
    call    eax
    sub esp, 16
    cmp esi, esp ; for check
    call    __RTC_CheckEsp ; for check
    mov esi, esp ; for check
Все работает отлично.
Не знаю чего тут посоветовать: юзай mingw, если не хочешь связываться с ассемблером
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru