Проблемы с COM, IShellWindows

Тема в разделе "WASM.BEGINNERS", создана пользователем protoman, 21 май 2007.

  1. protoman

    protoman New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2006
    Сообщения:
    6
    Вопрос по COM

    Уважаемые программеры дайте совет и сильно не бейте ногами я новичок в COM..

    Задачка: необходимо получить событие о том что открылось новое окно, т.е. dispIdMember = 200

    Делаю так:


    Мой test.inc файл, мои гуиды:


    Код (Text):
    1. ;MyEventClass - DShellWindowsEvents
    2.  
    3. sIID___MyEventClass TEXTEQU <{0FE4106E0H, 0399AH, 011D0H, {0A4H, 08CH, 000H, 0A0H, 0C9H, 00AH, 08FH, 039H}}>
    4.  
    5. ;shdocVw
    6. ; {EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}
    7. sLIBID___MyEventClass TEXTEQU <{0EAB22AC0H, 030C1H, 011CFH, {0A7H, 0EBH, 000H, 000H, 0C0H, 05BH, 0AEH, 00BH}}>
    8.  
    9. ; {EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}
    10. sCLSID___MyEventClass TEXTEQU <{09BA05972H, 0F6A8H, 011CFH, {0A4H, 042H, 000H, 0A0H, 0C9H, 00AH, 08FH, 039H}}>
    11.  
    12.  
    13. _vt__MyEventClass MACRO CastName:REQ
    14.   ; IDispatch methods
    15.   _vtIDispatch CastName
    16.   ; __MyEventClass methods
    17.     &CastName&GetTypeInfoCount        comethod2 ?
    18.     &CastName&GetTypeInfo             comethod4  ?
    19.     &CastName&GetIDsOfNames       comethod6  ?
    20.     &CastName&invoke_       comethod9 ?
    21. ENDM
    22.  
    23. __MyEventClass STRUCT
    24.   _vt__MyEventClass __MyEventClass
    25. __MyEventClass ENDS
    26.  
    27.  
    28.  
    29. IShellWindows                STRUCT DWORD
    30.     IShellWindows_QueryInterface                      comethod3             ?
    31.     IShellWindows_AddRef                              comethod1                     ?
    32.     IShellWindows_Release                    comethod1             ?
    33.     IShellWindows_GetTypeInfoCount             comethod2       ?
    34.     IShellWindows_GetTypeInfo             comethod4       ?
    35.     IShellWindows_GetIDsOfNames          comethod6       ?
    36.     IShellWindows_Invoke             comethod9       ?
    37.     IShellWindows_Get_Count comethod2         ?
    38.     IShellWindows_Item comethod3         ?
    39.     IShellWindows__NewEnum comethod2         ?
    40. IShellWindows                ENDS
    41.  
    42.  
    43. =====================================
    далее основной файл test.asm

    объявляю мой класс (по примерам из масма):

    Код (Text):
    1. MyEventClass   ClassItem { pCLSID___MyEventClass, DISPINTERFACE + SUPPLY_TYPE_INFO, \
    2.                            OFFSET IMyEventTypeLibInfo, OFFSET IMyEventIMap, \
    3.                            NULL, NULL, NULL, SIZEOF IMyEventObject }
    4.  
    5. IMyEventIMap   InterfaceItem { pIID___MyEventClass,  OFFSET vtableIMyEvent }
    6.                END_INTERFACE_MAP
    7.  
    8. ; describe the type libraries
    9. IMyEventTypeLibInfo   TypeLibInfo     { pLIBID___MyEventClass, 1, 0 }    
    10.  
    11. IMyEventObjData   STRUCT                  ; IMyEvent object private data struct
    12.     m_Value         DWORD           0   ; Value (private data member)
    13. IMyEventObjData   ENDS
    14.  
    15. IMyEventObject    STRUCT
    16.     ObjectData0     ObjectData      { } ; base values
    17. ;   IMyEventObjData0  IMyEventObjData   { } ; custom object data does not exist
    18.     ObjectEntry0    ObjectEntry     { } ; delegated Unknown
    19.     ObjectEntry1    ObjectEntry     { } ; IMyEvent
    20. IMyEventObject    ENDS
    21.  
    22. vtableIMyEvent       __MyEventClass       {pvtIDispatch}
    23.  
    24. затем мой invoke:
    25.  
    26. Invoke_ PROC  uses __this this_:DWORD, dispIdMember:DISPID, riid:DWORD, lcid:LCID, wFlags:WORD, pDispParams:DWORD, pVarResult:DWORD, pExcepInfo:DWORD, puArgErr:DWORD
    27.  
    28.     mov __this, this_
    29.    
    30.     pObjectData this_, edx
    31.     mov eax, (IMyEventObjData ptr [edx]).m_Value  ; get object data value
    32.     mov ecx, dispIdMember              ; get ptr to variable for return
    33.     mov [ecx], eax                              ; mov value to variable
    34.     xor eax, eax                                ; return S_OK
    35.  
    36.     .if dispIdMember == 200    
    37.         invoke MessageBox, NULL, ADDR sEvent, ADDR DlgName, MB_OK
    38.     .endif
    39.     ret
    40.  
    41. Invoke_ endp
    Затем реализация подключения к моему sink интерфейсу:

    Код (Text):
    1. ConnectEvent PROC pIAny:DWORD, pISink:DWORD, pIID_IEvent:DWORD, pdwCookie:DWORD
    2.     ; pIAny         Interface pointer that we wish to connect to. May not be NULL.
    3.     ; pISink        Callback Interface pointer. May not be NULL.
    4.     ; pIID_IEvent   ref of event IID to connect up. May not be NULL.
    5.     ; pdwCookie     ref of connection cookie. Must be NULL.
    6.     LOCAL _pICPC:DWORD, _pICP:DWORD
    7.  
    8.     coinvoke pIAny, IUnknown, QueryInterface, ADDR IID_CPC, ADDR _pICPC
    9.     .IF_SUCCEEDED
    10.         ; Our object supports events, let's get one!
    11.         coinvoke _pICPC, IConnectionPointContainer, FindConnectionPoint, pIID_IEvent, ADDR _pICP
    12.         .IF_SUCCEEDED
    13.             ; advise we want events here
    14.             .IF_SUCCEEDED
    15.                 coinvoke _pICP, IConnectionPoint, Advise, pISink, pdwCookie
    16.                 ; now we have our event link, release the intermediate interfaces
    17.                 coinvoke _pICP, IUnknown, Release
    18.             .ENDIF
    19.         .ENDIF
    20.          coinvoke _pICPC, IUnknown, Release
    21.     .ENDIF                        
    22.     ret
    23. ConnectEvent ENDP
    и наконец сама программа:


    Код (Text):
    1. testpproc proc
    2.  
    3. mov pMyEventClass, 0
    4.  
    5. invoke  CoInitialize, 0
    6.  
    7.  invoke CoCreateInstance,offset CLSID_ShellWindows, 0, CLSCTX_ALL, addr IID_ShellWindows, addr pps
    8. .IF eax == S_OK  
    9.    
    10.     invoke AllocObject, ADDR p_IMyEvent, OFFSET MyEventClass, NULL, NULL
    11.           .IF_FAILED
    12.                     jmp BadStart
    13.                 .ENDIF
    14.                
    15.     invoke ConnectEvent, pps,p_IMyEvent,pIID___MyEventClass, ADDR dwCookie
    16.  
    17.     .IF pMyEventClass != 0
    18.                 ; we have an object, release it
    19.                 coinvoke pMyEventClass, __MyEventClass, Release
    20.             .ENDIF
    21.    
    22.     ret
    23.    
    24.     BadStart:
    25.                 invoke MessageBox, NULL, ADDR sFatal2, ADDR sFatal1, MB_OK or MB_ICONSTOP
    26.  
    27.  
    28. .endif
    29.  
    30. testpproc endp
    31.  
    32. start:
    33.      
    34. invoke CreateThread, NULL, 0, addr testpproc, NULL, NULL, 0
    35.  
    36. invoke Sleep,30000
    37.  
    38. call    ExitProcess
    39. end start
    В принципе это все но почемуто не отлавливаются события о создании нового окна, а просто при создании
    виснет приложение и это видимо изза постоянных ConnectEvent'ов. Метод Invoke_ реализован
    но почемуто не опрашивается. В чем может быть дело, дайте совет. спасибо
     
  2. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60