Почему при вызове функции передается только первый аргумент - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь вызвать функцию (в строке 15) только через приведение, но передается только первый аргумент, как я могу это исправить?

Я попытался изменить значение с плавающей точкой "2" на 2,0f, чтобы объявить, что это число с плавающей точкой, а не int, но оно все еще не работает.

! Обратите внимание, что код ужасен, потому что это код гольф , строка 15 должна быть в форме dll позже, этот код здесь просто тестовая программа, чтобы избежать запуска целевого процесса несколько раз , Вот мой фактический код с результатом 58 символов

DllMain(a,b,c){((int(*)(int,float))927309216)(‭7903472‬,2);}
#include <Windows.h>
#include <stdio.h>
char * sSkelModelStencil = "SkelModelStencil"; //here I reproduce the char like it is in the memory

void SetConsoleFloat(const char *sKey, float fVal) //this is the reproduction of SetConsoleFloat in CShell.dll
{
    printf("arg1:    %s    arg2: %f\n", sKey, fVal); //printing the arguments getting passed into the function
    return;
}

int main()
{
    while (1) {
        SetConsoleFloat("SkelModelStencil", 2); //calling the reproduction function
        ((int(*)())SetConsoleFloat)(sSkelModelStencil,2); //calling the reproduction function via a cast & using SetConsoleFloat addr
        system("PAUSE");
    }
}

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

В некоторых архитектурах способ передачи аргументов зависит от способа их объявления.Например, специальные регистры могут использоваться для float параметров.Важно объявление типа функции, а не объявление выражения аргумента.

Сигнатура параметра () отличается от (const char *sKey, float fVal), и в результате аргумент fVal передается по-другомуот того, как функция ожидает его получения.

1 голос
/ 03 июня 2019

Прежде всего - это ужасный код, не делайте этого.

Во-вторых - скомпилируйте свой код с предупреждениями компилятора, чтобы компилятор мог сказать вам, где вы можете ошибаться. Конечно, вам нужен правильный компилятор C (а MSVC нет, если вы его используете). GCC скажет вам:

a.c:15:10: warning: function called through a non-compatible type

Но, чтобы ответить на ваш вопрос: вы используете неверный тип функции: вы используете тип функции void (); но вам нужно void (const char*, float). Итак, попробуйте:

((void(*)(const char*, float))SetConsoleFloat)(sSkelModelStencil,2);

вместо существующей строки 15. Для ясности также целесообразно отделить приведение типов от определений типов функций:

typedef  void (*scf_function_t)(const char*, float);

раньше, а затем:

((scf_function_t) SetConsoleFloat)(sSkelModelStencil,2);

но, опять же, на самом деле нет веской причины делать это во-первых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...