2015-08-06 4 views
1

Возможно, это странный вопрос, поэтому я не знаю, какой из них является лучшим для него.Вызов DLL dynamiclly C++

Вот моя проблема:

я должен сделать программу тестера времени DLL в C++, которые могут загрузить DLL и попробовать свои функции, тестирование, если дать правильные результаты и проверки времени, которое требуется для выполнения их , Таким образом, это означает, что во время выполнения моей программы я получаю DLL или другие, загружаю их и вызываю их функции, не зная, сколько параметров у них есть (перед компиляцией моей программы).

Поэтому я понимаю, что я не могу объявить указатели на нужды функций GetProcAddress, если я не объявляю динамически (я не знаю, могу ли я сделать это в C++). Ни один из них не включает заголовок динамической библиотеки DLL.

Единственное решение, которое я могу найти, что моя программа сгенерирует новый С или С ++ файл со всеми вещами necesary вызывать функции DLL, компилируется, luanch его ...

Можете ли вы дать мне мнения, идеи , возможно, есть способ сделать это на C++, и я пропущу его.

Я использую C++, с кодовым блоком 13.12 и MinWG 4.8. Спасибо всем заранее и извините за мой бедный английский.

+0

звучит так, будто вы правы, на компилированном языке я не вижу более чистой альтернативы генерации кода на лету. – gt6989b

+0

В какой форме вы получили бы описание того, как вызвать функцию? Скажем, вам нужно проверить функцию, которая получает два 'char *'. Что вы должны сделать? –

+0

Программа имеет доступ ко всей информации о функции, имени, индексе, параметрах, типе возврата. Но только после компиляции. И мне просто нужно запустить эту функцию, чтобы получить результат (пользователь будет проверять, что это правильно) и проверить время, необходимое для его настройки. Эта работа звучит лучше для интерпретируемого языка, но они просят меня работать в C++: S – JoseleMG

ответ

2

Существует два основных решения этой проблемы.

1) заполните все возможные функции «на лету», а затем, когда вы вызываете функцию, вы можете выбрать правильный шаблон и заполнить детали.

2) генерировать код на лету.

1) Не так сложно, как кажется, поскольку существует большое количество функционально идентичных функций. Возможно, что две функции удовлетворяют всем функциям параметров 0 (stdcall + cdecl). 2 функции для вызова одного параметра и т. Д. Правильные данные (например, указатель и размер) получают псевдоним в указатель1, указатель2 и затем передаются в общую функцию void * Func1_2params (void *, void *); - это может соответствовать вызывающему соглашению void func1 (char, char) ;, int strtok (char *, char *) ;, ... как слот (reg/stack) для каждого элемента параметра - «размер указателя»

2) Существует библиотека ffi (интерфейс внешней формы), которая связывает языки сценариев с C/C++, которые могут быть использованы для создания кода «на лету» для создания правильного интерфейса, это было бы не совсем прямолинейно, но можно заставить это работать. Наконец, некоторые языки скриптов имеют прямые вызовы (java, luajit). Было бы относительно легко внедрить luajit в ваш код и использовать небольшое количество lua для создания call-сайта из «lua view» функции в native, а затем вызвать DLL.

+0

Спасибо, это действительно уменьшает возможности, возможно, я могу установить максимальное количество принятых параметров. И если я хочу получить результат функции ?, Просто с литым от void * до правильного типа будет работать? Пример: typedef void * (* Myfunc) (void *, void *); ....... Myfunc myfunc (0); .... int n = (int) (myfunc) (db, что-то); – JoseleMG