хук WM_COPYDATA и иже с ним...

Тема в разделе "WASM.WIN32", создана пользователем XCoder, 15 авг 2005.

  1. XCoder

    XCoder New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2004
    Сообщения:
    9
    Есть GUI приложение. Есть dll с хуком WM_COPYDATA. Необходимо после поимки этого мессаджа пересласть приложению стр-ру NOTIFYICONDATA, вытянутую из COPYDATASTRUCT (я все сделал осталось переслать). Краем уха что-то слышал про файл-маппинг. Кто знаком с этим очень прошу поделиться инфой.

    Заранее спасибо.
     
  2. novIce

    novIce New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    45
    Адрес:
    Russia
    XCoder

    >Кто знаком с этим очень прошу поделиться инфой.

    http://msdn.microsoft.com/library/d...s/file_mapping_security_and_access_rights.asp

    Там и примеры есть правда все на буржуйском.

    Хотя лично я разбирался по статье:

    http://www.flipcode.com/articles/article_filemapping.shtml

    Просто о достаточно сложном must read

    Короче ВСЕМ рекомендую эту статью.

    вообще File mapping интересная тема МО соберусь с мыслями и статью напишу...если volodya пропустит ;)
     
  3. novIce

    novIce New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    45
    Адрес:
    Russia
    Млин ссылки не правильно оформил confused

    Пардон, торопился ;0
     
  4. XCoder

    XCoder New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2004
    Сообщения:
    9
    Спасибо! Читаемс...
     
  5. XCoder

    XCoder New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2004
    Сообщения:
    9
    С проецированием файлов разобрался...но теперь нашел другие глюки. NOTIFYICONDATA из WM_COPYDATA выдираю следующим образом:

    Ставлю хук на WH_CALLWNDPROC. В хук-функции пишу следующее


    Код (Text):
    1.  
    2. (код из длл)
    3. type
    4.    TShellTrayData = packed record
    5.    dwUnknown : longword;
    6.    dwMessage : longword;
    7.    nid       : NOTIFYICONDATA;
    8. end;
    9.  
    10.  
    11. var
    12.    pcwp : PCWPSTRUCT;
    13.    pcd  : PCOPYDATASTRUCT;
    14.    ptd  :^TShellTrayData;
    15.  
    16.  
    17. function hookfunc(c0de, wParam, lParam : integer): Lresult; stdcall;
    18. begin
    19.    if c0de >= 0 then
    20.    begin
    21.       pcwp := Pointer(lParam);
    22.       if pcwp^.message = WM_COPYDATA then
    23.       begin
    24.          pcd := PCOPYDATASTRUCT(pcwp^.lParam);
    25.          ptd := Pointer(pcd^.lpData);
    26.          nid := pShellTrayData.nid;
    27.  




    После этого пишу инфу в спроецированный файл и посылаю свое сообщение в приложение (пробовал варианты с записью в физический файл, прога ведет себя одинаково так что тут все ок). Приложение по обработке этого сообщения открывет файл, берет ту структуру и дальше я с ней играюсь путем Shell_NotifyIcon с флагами NIM_ADD и NIM_DELETE соответственно. Делал на примере Total Commander, все работает, только после того как я сам удалил и потом восстановил в трее его иконку, от szTip осталась одна буква "Т". С другими программами кроме тотала иконка не хочет корректно восстанавливаться после того, как удалил. Например прога FWatcher. Перехватив ее WM_COPYDATA узнал nid.wnd и это оказался хэндл какого-то невидимого окна TPUtilWindow однако находящегося в одном адресном пространстве с процессом FWatcher.exe (узнал с помощью Spy++). Я в растерянности, где тут грабли??? Надеюсь на помощь профессионалов.