Конференция "Основная" » Как передать значения из DLL в приложение? [D5, D7, Win95/98, WinXP]
 
  • denmin © (18.03.08 10:00) [0]
    Здравствуйте.
    Есть программа, которая использует dll, которая в свою очередь перехватывает открытие и закрытие окон и пишет все это дело в текстовый файл. но нужно чтобы передавала значения в саму программу использующую эту библиотеку.
    Как это сделать? Все перерыл, ничего не нашел.
    Заранее благодарен.
  • Сергей М. © (18.03.08 10:03) [1]

    > которая в свою очередь перехватывает открытие и закрытие
    > окон


    Глоб.хук что ли ?
  • Style © (18.03.08 10:20) [2]

    > передавала значения в саму программу использующую эту библиотеку.


    какие вообще проблемы ? Библиотека твоя? Ну напиши функцию экспортируемую , назови ее как нить GetValue, пусть она возвращает значение при вызове из твоего приложения. Можешь также в процедуру инициализации твоей библиотеки передать Handle главного окна программы, и при необходимости посылать пользовательское оконное сообщение из библиотеки главному окну.
  • Семеныч (18.03.08 11:48) [3]
    > denmin ©   (18.03.08 10:00)

    > Как это сделать?

    Зависит от ответов на такие вопросы:

    1. Можете ли Вы эту DLL перекомпилировать?

    2. DLL перехватывает открытие и закрытие окон через глобальный хук или как-то иначе?
  • denmin © (18.03.08 14:48) [4]
    библиотека моя. перекомпилировать могу. т.к. машины не очень мощный, то не хотелось бы использовать sendmessage. хук на WM_CBT. надо чтобы при срабатывании хука мое приложение получало сообщение но при этом загрузка системы была минимальна. слышал что-то типа внутреннего события, но не помню что такое. может ошибаюсь.
  • Сергей М. © (18.03.08 15:00) [5]

    > может ошибаюсь


    Ошибаешься.
  • Семеныч (18.03.08 15:26) [6]
    > denmin ©   (18.03.08 14:48) [4]

    Хук глобальный, поэтому механизм обратного вызова (callback) не прокатит. Используйте Send/PostMessage. Через систему проходит такая куча сообщений, что Ваши будут каплей в море.
  • denmin © (18.03.08 15:31) [7]
    Вот пример исходника библиотеки на VB:

    Начало библиотеки (объявление общей функции)

    Option Explicit

    Public Event GetWin32Prc (lParam as Long) – общая функция

    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long


    Обработка перехвата в библиотеке

    CopyMemory EMSG, ByVal lParam, Len(EMSG)
       Case HCBT_CREATEWND
    RaiseEvent GetWin32Prc (EMSG.lParamLow)

    Это начало приложения…

    Dim WithEvents sh As cSystemHook

    Private Sub sh_ GetWin32Prc (lParam as Long)
    Msgbox “Результат: ” & CStr(lParam)
    End Sub
  • Сергей М. © (18.03.08 15:43) [8]

    > denmin ©   (18.03.08 15:31) [7]


    К чему приведен этот VB-код ?
    К твоей задаче он не имеет отношения.
  • denmin © (18.03.08 15:58) [9]
    в окне этого VB приложения я вижу все открываемые окна, процессы. в приложении, а не в текстовом файле. в этом примере передается значение от библиотеки приложению через функцию, Public Event GetWin32Prc (lParam as Long) – общую функцию. в библиотеке объявлена функция Public Event GetWin32Prc (lParam as Long) и этаже функция объявлена в приложении

    Dim WithEvents sh As cSystemHook
    Private Sub sh_ GetWin32Prc (lParam as Long)

    и посредством этого у приложнения и библиотеки есть обратная связь. возможно ли  в дельфи создать нечто подобное?
  • denmin © (18.03.08 16:27) [10]
    есть ли способ использовать WM_CBT без использование библиотек?
  • Сергей М. © (18.03.08 16:30) [11]

    > denmin ©   (18.03.08 15:58) [9]


    Ты не понимаешь механизм работы глобальных хуков.
    Экз-ры хук-библиотеки находятся в изолированных адресных пространствах процессов, поэтому RaiseEvent тут идет лесом.

    Читай [6]
  • Сергей М. © (18.03.08 16:33) [12]
    Или у тебя локальный хук ?

    Тогда, разумеется, RaiseEvent работает, и без dll можно обойтись, равно как и без Send/PostMessage
 
Конференция "Основная" » Как передать значения из DLL в приложение? [D5, D7, Win95/98, WinXP]
Есть новые Нет новых   [134484   +48][b:0][p:0]