Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.211.87] |
|
Сообщ.
#1
,
|
|
|
Кратко.
Основное приложение отправляет запрос в dll Этот запрос обрабатывается в dll. Как передать результат из dll в основную программу ????? Вот код из dll invoke mysql_real_query,hConn,SqlComm,lenn ; Выполнить запрос .if eax!=0 invoke PrintErrors ; Обработать если ошибка jmp Exit_5 .endif invoke mysql_store_result,hConn ; Получить результат запроса -> MYSQL_RES mov result,eax .if eax!=0 invoke PrintErrors jmp Exit_5 .endif invoke mysql_num_rows,result ; Получаем количество записей в таблице mov NumRows,eax invoke mysql_num_fields,result ; Количество запрошенных полей таблицы mov NumFields,eax |
Сообщ.
#2
,
|
|
|
Что "всё это"?
Где этот код? Внутри какой-то экспортируемой процедуры, которая вызывается из EXE-шника? Тогда пусть эта процедура будет выглядеть как-то так: GetData PROC BufAddr:DWORD . . . mov eax,BufAddr mov [eax],Данные1 mov [eax+4],Данные2 mov [eax+8],Данные3 . . . GetData ENDP BufAddr - это адрес буфера типа BufStruc STRUC Data1 DD ? Data2 DD ? Data3 DD ? ENDS (если MASM32) Т.е. GetData PROTO :DWORD .DATA Buffer BufStruc <> . . . .CODE . . . invoke GetData, ADDR Buffer |
Сообщ.
#3
,
|
|
|
А процедура из exe-шника, это обычный вызов функции
с двумя параметрами, адрес SQL- запроса и размер (длинна) этого запроса. Код который в посте находится в моей dll. result MYSQL_RES <> ; Структура котора принимает данные из таблицы Дело в том, что из dll, в основную программу можно передать адрес этой структуры тогда извлекать данные из базы придется в в ней, Либо передавать в основную программу уже готовые данные. |
Сообщ.
#4
,
|
|
|
Цитата cain52 @ А вопрос-то в чём? Дело в том, что из dll, в основную программу можно передать адрес этой структуры тогда извлекать данные из базы придется в в ней, Либо передавать в основную программу уже готовые данные. Второй метод выглядит нормально. Хотя, конечно, смотря какая задача стоит... |
Сообщ.
#5
,
|
|
|
Задача простая.
Максимум разгрузить основную программу. Работу с MySql, вынести в отдельную dll, а в основной программу только обрабатывать готовые результаты. В принципе я тут нашел можно передавать результат при помощи Win API функция PostMessage, через сонстанту WM_USER > 1 Только пока не могу понять как это сделать. |
Сообщ.
#6
,
|
|
|
Так, нужна асинхронная передача? Не по запросу от основной программы?
|
Сообщ.
#7
,
|
|
|
Да именно так.
По тому и вынесено работа с базой в отдельную dll. Основная программа сделала запрос, dll обработала этот запрос и результат передала основной программе, а та уже сама разбирается, что и куда расталкивать. |
Сообщ.
#8
,
|
|
|
Цитата cain52 @ Через функцию инициализации передаётся хендл окна и код сообщения (> WM_USER) и далее DLL-ка создаёт параллельный поток и делает свою работу. Когда работа завершится, вызывает PostMessage(hwnd, message_id, data_ptr, 0). Если менеджер памяти не общий, то данные создаёт DLL-ка, а для удаления прога вызывает функцию DLL типа FreeData(data_ptr). В принципе я тут нашел можно передавать результат при помощи Win API функция PostMessage, через сонстанту WM_USER > 1 Только пока не могу понять как это сделать. |
Сообщ.
#9
,
|
|
|
Цитата cain52 @ Да именно так. По тому и вынесено работа с базой в отдельную dll. Похоже ты путаешь понятие dll и отдельного потока приложения. Dll - это просто хранилище кода дополнительных процедур и функций. Как работают эти функции - синхронно или асинхронно, зависит только от реализации самих функций. Поэтому не важно, где находится их код, в приложении или в dll. Т.е. если функция выполняется синхронно, то не важно, находится она в основном приложении, или в dll - по любому вызывающий ее код основного приложения будет ждать ее завершения и возврата результата. В этом случае городить огород с асинхронным возвратом результата (через PostMessage или еще как) не имеет никакого смысла - проще вернуть результаты через var\out параметры функции. И наоборот, если функция выполняется асинхронно (в отдельном потоке), то она и результат должна выдавать асинхронно, независимо от того, находится она в dll или в основном приложении. |