Как проверить есть ли функция во внешней библиотеке до ее вызова?

 

Споткнулся об проблему: есть эксперт, хочу к нему написать несколько "плугинов" оформленных в виде внешних библиотек (чтобы не трогая самого эксперта компилить только их). Но вызывать их хочу только в том случае если они есть. Например: написал функцию трала -> получил ex4 с заданным именем (например ex-TralingStop). В эксперте включил описание:

#import "ex-TralingStop.ex4" 
  int TralingStop();

Теперь хочу чтобы эксперт мог проверить: если такая функция ( TralingStop(); ) доступна - вызвать ее, если нет - то не вызывать. Нечто вроде:

if(Exists("ex-TralingStop.ex4","TralingStop")) TralingStop();

Если просто вызвать функцию без проверки, или в результате перекомпиляции не получился файл ex4 из за ошибок в коде - эксперт останавливается с сообщением что TralingStop() не найден и больше не работает. А мне бы хотелось чтобы он дальше делал себе то что умеет, но пока без этой функции.

Знает ли кто какой нибудь работающий способ сделать такое?

 

Можно сделать файл с пустыми функциями и еще одну функцию для проверки рабочая библиотека или пустышка.

 

.. замкнуто-порочный круг, т.е. проверить:

# а есть ли там вызываемая процедура ..

# процедура есть, а то ли кол-во параметров она берет,

# а какая версия алгоритма работы на контролькном примере

# а что она возвращает - массив или число или логику )))

Короче интеллектуалный каталогизатор библиотек а не трейдер )

 

Для загрузки библиотеки можно использовать kernel32.LoadLibraryA (или LoadLibraryW); для получения адресов функций из загруженных библиотек - GetProcAddress. Для плагинов я бы предложил организовать дополнительную dll'ку, предоставляющую интерфейс следующего вида:

1) функция, загружающая библиотеку по имени и возвращающая хэндл (обёртка вокруг LoadLibrary)

2) функция, получающая адрес ф-ии посредством GetProcAddress по заданным хэндлу и имени функции; должна возвращать адрес искомой функции либо нулевой указатель (обёртка вокруг GetProcAddress)

3) функция, позволяющая выполнить вызов функции по адресу с проверкой на его корректность (передаем адрес и строчку с параметрами; при этом все функции плагинов оформляем таким образом, чтобы им передавалась текстовая строка с параметрами, а они уже сами разбивали её и извлекали нужные параметры... если вам, конечно, нужны параметры)

Вообще вариантов уйма - можно ещё сделать перечисление всех библиотек в заданной папке; грузить их по очереди и при обнаружении в конкретной библиотеке функции с именем типа InitMyCoolPlugin регистрировать её в советнике каким-либо образом (массивы в помощь), после чего, консультируясь с внутренней таблицей эксперта о необходимости того или иного плагина - решать, что и откуда грузить.

Вообще тема обширная, имхо тянет на статью :) Может кто возьмется написать?

 
lea >>:

Для загрузки библиотеки можно использовать kernel32.LoadLibraryA (или LoadLibraryW); для получения адресов функций из загруженных библиотек - GetProcAddress.

Я уж было обрадовался :(

Для DLL - действительно такое можно сделать, но в МТ внешние эксперты это "честные" ex4-файлы и их загрузка и связывания выполняется (я так думаю) средствами самого МТ.

Наверно самое простое решение это все таки предложение Integer-a: делаю пустышку с одной единственной функцией FunctionsExsist возвращающей false. Пустышка должна быть всегда. Если вместо нее сделано чтото "более содержательное" (в котором кроме самой FunctionsExsist есть еще куча других функций-плугинов), то там она возвращает true и тогда в коде основного эксперта можно просто прописать:

if(FunctionsExsist) // есть живые плугины - их функции можно вызывать
{
  ...
  Check(....
  ...
  TralingStop(....
  ...
}
// плугинов нету - ничего не вызывается и эксперт не ломается на вызове несуществующих функций

Для надежности - можно (системными средствами) до вызова этого кода проверить наличие самого файла с плугинами "ex-TralingStop.ex4" и если его нет, эту проверку не делать (ибо как эксперт поламается на обращении к отсутвующей функции FunctionsExsist).

Не самое красивое решение - но достаточно простое и будет работать. Если кто найдет получше - поделитесь ;)

 

врядли вообще получится подменить библиотечный файл во время работы эксперта. Или файл занят будет или эксперт не будет его перечитывать.

Только через длл есть шанс реализовать загрузку времени выполнения.