Представьте себе, что вы хотите написать программу, которая тестирует функции в dll-файле c ++.
Вы должны разрешить пользователю выбирать dll (мы предполагаем, что речь идет о c ++ dll).
Он должен иметь возможность получить список всех функций, экспортируемых DLL.
Затем пользователь должен иметь возможность выбрать имя функции из списка, вручную ввести список аргументов (все основные типы аргументов, такие как массивы int, double, bool или char (например, строки c-типа)) и попытаться выполнить запустить выбранную функцию с указанными аргументами.
Он хотел бы знать, выполняется ли функция с указанными аргументами или они вызывают ее сбой (например, потому что они не совпадают с сигнатурой).
Основная проблема заключается в том, что C ++, будучи языком со строгой типизацией, требует, чтобы вы знали количество и тип аргументов для вызова функции во время компиляции. А в моем случае я просто не знаю, что это за аргументы До тех пор, пока пользователь не выберет их во время выполнения.
Единственное решение, которое я нашел, состояло в том, чтобы использовать ассемблер, чтобы вручную выдвигать аргументы в стеке вызовов.
Однако я пришел к выводу, что если я захочу поработать со сборкой, мне лучше убедиться, что я знаю, какое соглашение о вызовах используются функциями в dll.
Итак (наконец-то :) вот мой вопрос: могу ли я вывести соглашение о вызовах программно? Зависимость Уокер мне не поможет, и я не знаю, как вручную читать формат PE.