Представьте, что вы хотите написать программу, которая проверяет функции в dll-файле C++. Вы должны разрешить пользователю выбирать dll (мы предполагаем, что мы говорим о dll C++). Он должен иметь возможность получить список всех функций, экспортируемых DLL. Затем пользователь должен иметь возможность выбрать имя функции из списка, вручную ввести список аргументов (аргументы - это все основные типы, такие как массивы int, double, bool или char (например, строки c-type)) и попытаться для запуска выбранной функции с указанными аргументами. Он хотел бы знать, работает ли функция с указанными аргументами или они приводят к сбою (потому что они не соответствуют подписи, например).Могу ли я программно вывести соглашение о вызове, используемое dll C++?
Основная проблема заключается в том, что C++, будучи строго типизированным языком, требует, чтобы вы знали количество и тип аргументов для вызова функции во время компиляции. И в моем случае я просто не знаю, что эти аргументы пока пользователь не выберет их во время выполнения.
Единственное решение, с которым я столкнулся, состояло в том, чтобы использовать сборку для ручного ввода аргументов в стек вызовов.
Однако я пришел к пониманию, что если я хочу общаться с сборкой, я должен удостовериться, что я знаю, какие соглашения о вызове являются функциями в dll.
Итак (наконец-то :) вот мой вопрос: могу ли я вывести вызывающую конвенцию программно? Dependency Walker не поможет мне, и я не знаю, как вручную читать формат PE.
Почему у вас нет указателя на вызов? По умолчанию stdcall (это то, что есть на DLL, сгенерированном компиляторами microsoft в эти дни), но позволяет пользователю изменять его. – 2010-02-17 03:31:43
Ну, черт. Я просто об этом не думал! Я должен проверить, разрешено ли мне это делать, но если это так, это будет допустимым обходным решением :))) –