На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
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 или в основном приложении.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script Execution time: 0,1327 ]   [ 17 queries used ]   [ Generated: 24.04.18, 06:29 GMT ]