На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Не поленитесь, загляните в эти разделы перед созданием темы. Возможно, так уже имеется решение вашего вопроса.

3. Настоятельно рекомендую обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).

Не забывайте также про главные ПРАВИЛА ФОРУМА!
Участники форума, нарушающие правила, будут наказываться, а вносящие вклад в развитие форума – приветствовать и, по возможности, награждаться :)

Приятного вам общения! ;)
Модераторы: Jin X, Qraizer
  
> Обмен данными между DLL и основным приложением
Кратко.
Основное приложение отправляет запрос в dll
Этот запрос обрабатывается в dll.
Как передать результат из dll в основную программу ?????
Вот код из dll
ExpandedWrap disabled
    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
Что "всё это"?
Где этот код? Внутри какой-то экспортируемой процедуры, которая вызывается из EXE-шника?
Тогда пусть эта процедура будет выглядеть как-то так:
ExpandedWrap disabled
    GetData PROC BufAddr:DWORD
        . . .
       mov eax,BufAddr
       mov [eax],Данные1
       mov [eax+4],Данные2
       mov [eax+8],Данные3
        . . .
    GetData ENDP

BufAddr - это адрес буфера типа
ExpandedWrap disabled
    BufStruc STRUC
      Data1 DD ?
      Data2 DD ?
      Data3 DD ?
    ENDS

(если MASM32)

Т.е.
ExpandedWrap disabled
    GetData PROTO :DWORD
     
    .DATA
       Buffer BufStruc <>
        . . .
     
    .CODE
        . . .
        invoke GetData, ADDR Buffer
user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
А процедура из exe-шника, это обычный вызов функции
с двумя параметрами, адрес SQL- запроса и размер (длинна) этого запроса.
Код который в посте находится в моей dll.

result MYSQL_RES <> ; Структура котора принимает данные из таблицы

Дело в том, что из dll, в основную программу можно передать адрес этой структуры
тогда извлекать данные из базы придется в в ней,
Либо передавать в основную программу уже готовые данные.
Цитата cain52 @
Дело в том, что из dll, в основную программу можно передать адрес этой структуры
тогда извлекать данные из базы придется в в ней,
Либо передавать в основную программу уже готовые данные.
А вопрос-то в чём? :)
Второй метод выглядит нормально. Хотя, конечно, смотря какая задача стоит...
user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
Задача простая.
Максимум разгрузить основную программу.
Работу с MySql, вынести в отдельную dll, а в основной программу только обрабатывать
готовые результаты.
В принципе я тут нашел можно передавать результат при помощи
Win API функция PostMessage, через сонстанту WM_USER > 1
Только пока не могу понять как это сделать.
Так, нужна асинхронная передача? Не по запросу от основной программы?
user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
Да именно так.
По тому и вынесено работа с базой в отдельную dll.
Основная программа сделала запрос, dll обработала этот запрос
и результат передала основной программе, а та уже сама разбирается,
что и куда расталкивать.
Цитата cain52 @
В принципе я тут нашел можно передавать результат при помощи
Win API функция PostMessage, через сонстанту WM_USER > 1
Только пока не могу понять как это сделать.
Через функцию инициализации передаётся хендл окна и код сообщения (> WM_USER) и далее DLL-ка создаёт параллельный поток и делает свою работу. Когда работа завершится, вызывает PostMessage(hwnd, message_id, data_ptr, 0). Если менеджер памяти не общий, то данные создаёт DLL-ка, а для удаления прога вызывает функцию DLL типа FreeData(data_ptr).
user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
Цитата cain52 @
Да именно так.
По тому и вынесено работа с базой в отдельную dll.

Похоже ты путаешь понятие dll и отдельного потока приложения. Dll - это просто хранилище кода дополнительных процедур и функций. Как работают эти функции - синхронно или асинхронно, зависит только от реализации самих функций. Поэтому не важно, где находится их код, в приложении или в dll. Т.е. если функция выполняется синхронно, то не важно, находится она в основном приложении, или в dll - по любому вызывающий ее код основного приложения будет ждать ее завершения и возврата результата. В этом случае городить огород с асинхронным возвратом результата (через PostMessage или еще как) не имеет никакого смысла - проще вернуть результаты через var\out параметры функции. И наоборот, если функция выполняется асинхронно (в отдельном потоке), то она и результат должна выдавать асинхронно, независимо от того, находится она в dll или в основном приложении.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1075 ]   [ 19 queries used ]   [ Generated: 19.01.18, 17:33 GMT ]