Есть приложение, которое грузит плагины. При инициализации плагина оно вызывает из него функцию, посредством которой оно заполняет массив структур с описаниями экспортируемыми из плагина функциями. В структуре есть указатель на экспортируемую функцию и информация о количестве/типе ее параметров. Мне нужно создавать этот массив динамически, чтобы можно было использовать в 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 функций с переменным числом параметров
Здравствуйте, Аноним, Вы писали:
А>Есть приложение, которое грузит плагины. При инициализации плагина оно вызывает из него функцию, посредством которой оно заполняет массив структур с описаниями экспортируемыми из плагина функциями. А>В структуре есть указатель на экспортируемую функцию и информация о количестве/типе ее параметров.
Эту информацию можно описать в виде интерфейса (структуры с абстрактными методами).
Плагин экспортирует реализации этих интерфейсов (конкретные реализации методов).
Мне нужно создавать этот массив динамически, чтобы можно было использовать в dll любое количество функций с любым количеством параметров. Вопрос — как это сделать. Пока единственная идея — использовать в dll/плагине экспортируемые функции с переменным числом аргументов, например так:
Непонятно.
Имею скафандр — готов путешествовать!
Re[2]: Вызов dll функций с переменным числом параметров
Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько угодно"? Объявить класс с открытой функцией от переменного количества аргументов, потом создать объекты этих классов, столько, сколько нужно, и затем привести указатели на эти функции к указателям на тип аналогичной глобальной функции?
Re[2]: Вызов dll функций с переменным числом параметров
Здравствуйте, rus blood, Вы писали:
RB>Эту информацию можно описать в виде интерфейса (структуры с абстрактными методами). RB>Плагин экспортирует реализации этих интерфейсов (конкретные реализации методов). RB>Непонятно.
Задача в том, что саму программу изменить нельзя, можно только написать плагин.
Re: Вызов dll функций с переменным числом параметров
Здравствуйте, Аноним, Вы писали:
А>Вопрос — как это сделать.
Ну, например, можно возвращать указатель на статический массив и счётчик.
А можно их просто экспортировтаь даже.
Но как ты собираешься эти функции звать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Вызов dll функций с переменным числом параметров
Здравствуйте, dandy, Вы писали:
D>Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько угодно"? Объявить класс с открытой функцией от переменного количества аргументов, потом создать объекты этих классов, столько, сколько нужно, и затем привести указатели на эти функции к указателям на тип аналогичной глобальной функции?
Здравствуйте, dandy, Вы писали:
D>Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько угодно"? Объявить класс с открытой функцией от переменного количества аргументов, потом создать объекты этих классов, столько, сколько нужно, и затем привести указатели на эти функции к указателям на тип аналогичной глобальной функции?
1. Функция класса не получится привести к "глобальной" функции.
Вернее, "об колено" можно, но работать не будет.
2. Сколько объектов класса не создавай, его метод (тело метода) будет в единственном экземпляре, с единственной точкой входа.
Имею скафандр — готов путешествовать!
Re[2]: Вызов dll функций с переменным числом параметров
E>Ну, например, можно возвращать указатель на статический массив и счётчик.
В дефолтных плагинах именно так оно и делается, но мне нужно больше.
С условиями задачи я напутал: тип функции один:
SomeVar Function(int, SomeStruct *);
E>А можно их просто экспортировтаь даже.
Из плагина прога экспортирует функции инициализации, по — видимому через GetProcAddress (или еще чего).
Прога вызывает эти функции после загрузки плагина. В одной из них плагин устанавливает проге указатель
на свой массив указателей на свои функции, после этого прога может вызывать эти функции из плагина.
E>Но как ты собираешься эти функции звать?
Как сделать в плагине не статический массив указателей на функции, а динамический массив указателей на функции: that is the question
Re[4]: Вызов dll функций с переменным числом параметров
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, dandy, Вы писали:
RB>1. Функция класса не получится привести к "глобальной" функции. RB>Вернее, "об колено" можно, но работать не будет.
RB>2. Сколько объектов класса не создавай, его метод (тело метода) будет в единственном экземпляре, с единственной точкой входа.
Угу. На pure С++ задача не решается.
Re[3]: Вызов dll функций с переменным числом параметров
Здравствуйте, dandy, Вы писали:
E>>Но как ты собираешься эти функции звать?
D>Как сделать в плагине не статический массив указателей на функции, а динамический массив указателей на функции: that is the question
Есть некрасивое решение — определить в плагине много глобальных функций, возвращать проге массив указателей на часть из них. Но тогда количество функций плагина будет ограничено сверху, это не радует.
Re: Вызов dll функций с переменным числом параметров
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 функций с переменным числом параметров
On 11/16/2011 04:26 PM, dandy wrote:
> Еще вопрос: как можно сделать, чтобы таких функций было создать "сколько > угодно"? Объявить класс с открытой функцией от переменного количества
Просто создавай сколько угодно таких функций, и всё.
Но должен предупредить, что вызов любых функций с переменным
кол-вом параметров -- плохая идея. Компилятор не будет
проверять правильность вызовов этих функций (передачу
параметров, их типы, кол-во).
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Вызов dll функций с переменным числом параметров
On 11/16/2011 04:19 PM, rus blood wrote:
> Мне нужно создавать этот массив динамически, чтобы можно было использовать в dll > любое количество функций с любым количеством параметров. Вопрос — как это > сделать. Пока единственная идея — использовать в dll/плагине экспортируемые > функции с переменным числом аргументов, например так:
Ещё раз -- просто используй эти функции, и всё. ничего особенно для этого делать
не нужно.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Вызов dll функций с переменным числом параметров
Здравствуйте, dandy, Вы писали:
D>Есть некрасивое решение — определить в плагине много глобальных функций, возвращать проге массив указателей на часть из них. Но тогда количество функций плагина будет ограничено сверху, это не радует.
И что будет реализовано в этих функциях?
Заранее все алгоритмы напишешь?
Имею скафандр — готов путешествовать!
Re: Вызов dll функций с переменным числом параметров
On 11/16/2011 06:57 PM, rus blood wrote:
> Как предлагаешь это делать в runtime ?
Как угодно, в зависимости от желания. В рантайме конечно
скорее всего трудновато будет создавать сами функции (компилятор
там вызывать и прочее), но вот их описания -- кто ж запрещает ?