Вызов dll функций с переменным числом параметров
От: Аноним  
Дата: 16.11.11 12:01
Оценка:
Есть приложение, которое грузит плагины. При инициализации плагина оно вызывает из него функцию, посредством которой оно заполняет массив структур с описаниями экспортируемыми из плагина функциями. В структуре есть указатель на экспортируемую функцию и информация о количестве/типе ее параметров. Мне нужно создавать этот массив динамически, чтобы можно было использовать в dll любое количество функций с любым количеством параметров. Вопрос — как это сделать. Пока единственная идея — использовать в dll/плагине экспортируемые функции с переменным числом аргументов, например так:


extern "C" __declspec(dllexport)MyFunc(...)
{
  va_list vl;
  va_start(vl,amount);

  for (i=0;i<double_arg_count;i++)
  {
    double val=va_arg(vl,double);
  }

  for (i=0;i<int_arg_count;i++)
  {
    int val=va_arg(vl,double);
  }

  va_end(vl);
}


Так будет работать?
Re: Вызов dll функций с переменным числом параметров
От: sts  
Дата: 16.11.11 12:12
Оценка:
Да, будет.
Re: Вызов dll функций с переменным числом параметров
От: rus blood Россия  
Дата: 16.11.11 12:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть приложение, которое грузит плагины. При инициализации плагина оно вызывает из него функцию, посредством которой оно заполняет массив структур с описаниями экспортируемыми из плагина функциями. А>В структуре есть указатель на экспортируемую функцию и информация о количестве/типе ее параметров.


Эту информацию можно описать в виде интерфейса (структуры с абстрактными методами).
Плагин экспортирует реализации этих интерфейсов (конкретные реализации методов).


Мне нужно создавать этот массив динамически, чтобы можно было использовать в dll любое количество функций с любым количеством параметров. Вопрос — как это сделать. Пока единственная идея — использовать в dll/плагине экспортируемые функции с переменным числом аргументов, например так:

Непонятно.
Имею скафандр — готов путешествовать!
Re[2]: Вызов dll функций с переменным числом параметров
От: dandy  
Дата: 16.11.11 12:26
Оценка:
Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько угодно"? Объявить класс с открытой функцией от переменного количества аргументов, потом создать объекты этих классов, столько, сколько нужно, и затем привести указатели на эти функции к указателям на тип аналогичной глобальной функции?
Re[2]: Вызов dll функций с переменным числом параметров
От: dandy  
Дата: 16.11.11 12:29
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Эту информацию можно описать в виде интерфейса (структуры с абстрактными методами).

RB>Плагин экспортирует реализации этих интерфейсов (конкретные реализации методов).
RB>Непонятно.

Задача в том, что саму программу изменить нельзя, можно только написать плагин.
Re: Вызов dll функций с переменным числом параметров
От: Erop Россия  
Дата: 16.11.11 13:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос — как это сделать.

Ну, например, можно возвращать указатель на статический массив и счётчик.
А можно их просто экспортировтаь даже.

Но как ты собираешься эти функции звать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Вызов dll функций с переменным числом параметров
От: rus blood Россия  
Дата: 16.11.11 13:26
Оценка:
Здравствуйте, dandy, Вы писали:

D>Задача в том, что саму программу изменить нельзя, можно только написать плагин.


Если программу изменять нельзя, значит порядок работы с плагином уже фиксирован.
Тогда непонятно, к чему исходный вопрос.
Имею скафандр — готов путешествовать!
Re[3]: Вызов dll функций с переменным числом параметров
От: sts  
Дата: 16.11.11 13:35
Оценка:
Здравствуйте, dandy, Вы писали:

D>Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько угодно"? Объявить класс с открытой функцией от переменного количества аргументов, потом создать объекты этих классов, столько, сколько нужно, и затем привести указатели на эти функции к указателям на тип аналогичной глобальной функции?


Можно например так (схематично):

// DLL:

typedef void (*my_func_t)(...);

static void my_func_1(...) {

}

static void my_func_2(...) {

}

static void my_func_3(...) {

}

static my_func_t my_func[] = {my_func_1, my_func_2, my_func_3};
static int counter;

void dllexport get_first(my_func_t*result) {
    counter = 0;
    get_next(result);
}

int dllexport get_next(my_func_t*result) {
    if (counter < ARRAY_SIZE(my_func)) {
        *result = my_func[counter];
        ++counter;
        return OK;
    }
    return ERROR;
}

// Application:

int main() {

    my_func_t func;
    for ( get_first(&func); get_next(&func) == OK; ) {
        func();
    }
}
Re[3]: Вызов dll функций с переменным числом параметров
От: rus blood Россия  
Дата: 16.11.11 13:47
Оценка:
Здравствуйте, dandy, Вы писали:

D>Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько угодно"? Объявить класс с открытой функцией от переменного количества аргументов, потом создать объекты этих классов, столько, сколько нужно, и затем привести указатели на эти функции к указателям на тип аналогичной глобальной функции?


1. Функция класса не получится привести к "глобальной" функции.
Вернее, "об колено" можно, но работать не будет.

2. Сколько объектов класса не создавай, его метод (тело метода) будет в единственном экземпляре, с единственной точкой входа.
Имею скафандр — готов путешествовать!
Re[2]: Вызов dll функций с переменным числом параметров
От: dandy  
Дата: 16.11.11 13:50
Оценка:
Здравствуйте, Erop, Вы писали:


E>Ну, например, можно возвращать указатель на статический массив и счётчик.

В дефолтных плагинах именно так оно и делается, но мне нужно больше.
С условиями задачи я напутал: тип функции один:
SomeVar Function(int, SomeStruct *);


E>А можно их просто экспортировтаь даже.

Из плагина прога экспортирует функции инициализации, по — видимому через GetProcAddress (или еще чего).
Прога вызывает эти функции после загрузки плагина. В одной из них плагин устанавливает проге указатель
на свой массив указателей на свои функции, после этого прога может вызывать эти функции из плагина.

E>Но как ты собираешься эти функции звать?


Как сделать в плагине не статический массив указателей на функции, а динамический массив указателей на функции: that is the question
Re[4]: Вызов dll функций с переменным числом параметров
От: dandy  
Дата: 16.11.11 13:53
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, dandy, Вы писали:


RB>1. Функция класса не получится привести к "глобальной" функции.

RB>Вернее, "об колено" можно, но работать не будет.

RB>2. Сколько объектов класса не создавай, его метод (тело метода) будет в единственном экземпляре, с единственной точкой входа.


Угу. На pure С++ задача не решается.
Re[3]: Вызов dll функций с переменным числом параметров
От: dandy  
Дата: 16.11.11 14:16
Оценка:
Здравствуйте, dandy, Вы писали:

E>>Но как ты собираешься эти функции звать?


D>Как сделать в плагине не статический массив указателей на функции, а динамический массив указателей на функции: that is the question


Есть некрасивое решение — определить в плагине много глобальных функций, возвращать проге массив указателей на часть из них. Но тогда количество функций плагина будет ограничено сверху, это не радует.
Re: Вызов dll функций с переменным числом параметров
От: MasterZiv СССР  
Дата: 16.11.11 14:40
Оценка:
On 11/16/2011 04:01 PM, Аноним 225 wrote:

> Есть приложение, которое грузит плагины. При инициализации плагина оно вызывает

> из него функцию, Мне нужно, чтобы можно было использовать в dll любое
> количество функций с любым количеством параметров. Вопрос — как это сделать.

Так же, как и в случае, когда нужно сделать то же самое, но без .DLL.
с и без .dll ничем не отличается.

> Пока единственная идея — использовать в dll/плагине экспортируемые функции с

> переменным числом аргументов, например так:
>
>
> extern "C" __declspec(dllexport)MyFunc(...)

>

> Так будет работать?

Да. Только у тебя функция неправильно оформлена -- как минимум один параметр у
неё должен быть. во-первых, от него и будут отсчитываться остальные параметры,
во-вторых, ты должен на основании значения этого параметра понять, сколько
у тебя всего других параметров.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Вызов dll функций с переменным числом параметров
От: MasterZiv СССР  
Дата: 16.11.11 14:42
Оценка:
On 11/16/2011 04:26 PM, dandy wrote:

> Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько

> угодно"? Объявить класс с открытой функцией от переменного количества

Просто создавай сколько угодно таких функций, и всё.

Но должен предупредить, что вызов любых функций с переменным
кол-вом параметров -- плохая идея. Компилятор не будет
проверять правильность вызовов этих функций (передачу
параметров, их типы, кол-во).
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Вызов dll функций с переменным числом параметров
От: MasterZiv СССР  
Дата: 16.11.11 14:43
Оценка:
On 11/16/2011 04:19 PM, rus blood wrote:

> Мне нужно создавать этот массив динамически, чтобы можно было использовать в dll

> любое количество функций с любым количеством параметров. Вопрос — как это
> сделать. Пока единственная идея — использовать в dll/плагине экспортируемые
> функции с переменным числом аргументов, например так:

Ещё раз -- просто используй эти функции, и всё. ничего особенно для этого делать
не нужно.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Вызов dll функций с переменным числом параметров
От: rus blood Россия  
Дата: 16.11.11 14:57
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Просто создавай сколько угодно таких функций, и всё.


Как предлагаешь это делать в runtime ?
Имею скафандр — готов путешествовать!
Re[4]: Вызов dll функций с переменным числом параметров
От: rus blood Россия  
Дата: 16.11.11 14:59
Оценка:
Здравствуйте, dandy, Вы писали:

D>Есть некрасивое решение — определить в плагине много глобальных функций, возвращать проге массив указателей на часть из них. Но тогда количество функций плагина будет ограничено сверху, это не радует.


И что будет реализовано в этих функциях?
Заранее все алгоритмы напишешь?
Имею скафандр — готов путешествовать!
Re: Вызов dll функций с переменным числом параметров
От: dandy  
Дата: 16.11.11 15:08
Оценка:
Всем спасибо, буду смотреть в другую сторону.
Если что — правильное описание задачи (и некрасивое решение) в моих ответах Егору.
Re[5]: Вызов dll функций с переменным числом параметров
От: dandy  
Дата: 16.11.11 15:11
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>И что будет реализовано в этих функциях?

RB>Заранее все алгоритмы напишешь?

Реализация будет в других плагинах, попроще, писать их будут пользователи.
Re[5]: Вызов dll функций с переменным числом параметров
От: MasterZiv СССР  
Дата: 16.11.11 15:28
Оценка:
On 11/16/2011 06:57 PM, rus blood wrote:

> Как предлагаешь это делать в runtime ?


Как угодно, в зависимости от желания. В рантайме конечно
скорее всего трудновато будет создавать сами функции (компилятор
там вызывать и прочее), но вот их описания -- кто ж запрещает ?
Posted via RSDN NNTP Server 2.1 beta
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.