C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: вызов функций dll в потоке  (Прочитано 1435 раз)
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


вызов функций dll в потоке
« : 29 Апрель 2014, 14:11:12 »

Подключил либу, но ее функции хочу вызывать в отдельном потоке по действиям главного потока. Функций много, все с разными параметрами и разными возвращаемыми значениями. Кто какой механизм посоветует для реализации этого?

Я сейчас задачу-то выполнил, но выглядит это колхозно. И если потребуется аналогичное сделать для другой либы, то вновь катастрофически много ручной работы. Поясню что именно я сделал:

1. Объявил типы указателей на функции.
2. Объявил указатели на функции.
3. Динамически подключил функции через getProcAddress.
(тут пока все обычно при работе с dll)

4. В классе потока объявил точно такие же функции (но ничего не возвращающие).
5. Объявил приватные переменные всех типов которые могут быть возвращены (int, String, char*).
6. Объявил приватные переменные аналогичные всем какие могут быть во входных параметрах функций.
7. В реализации функций входные параметры присваиваю этим приватным переменным (см. п.6).
8. Устанавливаю индекс, соответствующий функции (её номер).
9. В методе Execute потока через switch-case по индексу вызываю уже функцию либы, взяв параметрами переменные из п.6.
10. Возврат функции присваиваю одной из переменных п. 5.
11. Обнуляю индекс.
12. В главном потоке по факту обнуления индекса понимаю, что вызов функции отработан и в выходной переменной нужного мне типа лежит значение.

Бррр, муть вышла. Она работает, но от объёма копипаста клавиши уже стерлись.
Неужто не найдётся человеческого подхода?


« Последнее редактирование: 29 Апрель 2014, 14:28:58 от POV » Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: вызов функций dll в потоке
« Ответ #1 : 29 Апрель 2014, 19:31:32 »

Вот, делал как-то классик для работы с DLL (динамическое подключение). Может пригодится )
Использование:
Код
TDll* Dll = new TDll("mydll.dll");
assert(Dll->Loaded); // проверить, загружена ли библиотека
Dll->Functionvoid>("FuctionName1"); // вызов функции void FuctionName1() без параметров
int i = Dll->Functionint,int,int>("Sum", 1, 2); // вызов функции int Sum(int, int)
delete Dll;
 
// общий принцип вызова:
// Dll->Function
// R - тип возвращаемого значения (void если нет)
// T1, T2, T3... - типы параметров функции (если есть)
 

Экономит время в части загрузки / выгрузки библиотеки и объявления функций. Что касается потока - здесь все стандартно. Главное - не забывай память освобождать )
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


« Ответ #2 : 29 Апрель 2014, 19:44:58 »

Буду иметь в виду.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.05 секунд. Запросов: 19.