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

 

Споткнулся об проблему: есть эксперт, хочу к нему написать несколько "плугинов" оформленных в виде внешних библиотек (чтобы не трогая самого эксперта компилить только их). Но вызывать их хочу только в том случае если они есть. Например: написал функцию трала -> получил 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).

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

 

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

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

Причина обращения: