IHTMLElementCollection проблемы

Тема в разделе "WASM.WIN32", создана пользователем Sickle, 3 май 2006.

  1. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    нужно вызвать метод item. в msdn вызов описан так:
    Код (Text):
    1. HRESULT item(          VARIANT name,
    2.     VARIANT index,
    3.     IDispatch **pdisp
    4. );
    5.  


    т.е. необходимо передать два варианта. так вот возникает вопрос - а как их передать? засунуть в стэк всю структуру (32 байта)? потому что если передавать указатель, то метод возвратит ошибку...
     
  2. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    походил я по коду в оле. похоже что именно саму структуру и нужно передавать. но вот как ее скормить coinvoke?
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Руками напиши. Один раз без coinvoke обойтись можно. Или напиши расширенный вариант coinvoke.
     
  4. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    обнаружил еще один момент. после возврата из метода, стек уменьшается на 24 байта. то что он уменьшается не удивительно, но я считал что уменьшаться он должен на 56 байт: вместо двух вариантов по 32 байта мы передаем два их адреса по 4 байта. т.е.

    (32-4)+(32-4)=56

    а получается странная арифметика:

    32-4-4=24

    :dntknw:
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Должно быть 16+16+4=36.



    Может, на 0x24?
     
  6. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    нет, на 0х18
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Вообще-то, это stdcall, стек уменьшает метод item. То есть, при укладке в стек двух структур и указателя стек должен уменьшиться на 36 байт, а после вызова (и возврата из) метода он должен выровняться. Если же он увеличивается, то ты кладёшь 12 байт, а нужно именно 36 (структуры копируются, а не кладутся указатели на них).

    Если уменьшается - значит, кладёшь больше, чем необходимо (36+24=60 байт).
     
  8. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    хех.. mov eax, sizeof (VARIANT) показывает 16 (десятичных)

    так что с арифметикой порядок выходит:

    (16-4)+(16-4)=24

    гут :) кое что прояснилось...

    а вот теперь вопрос в том как правильно уложить эти структуры в стек: двордами или байтами? сначала или с конца структуры?
     
  9. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    блин, ну чем не устраивают указатели? :) так бы все упростилось...
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Без разницы. Быстрее, конечно, по 4 дворда, с начала, конечно: (fasm)
    Код (Text):
    1. push  esp,pDisp
    2. sub  esp,10h
    3. mov  ecx,esp
    4. mov  eax,[var1]
    5. mov  edx,[var1+4]
    6. mov  [ecx],eax
    7. mov  [ecx+4],edx
    8. mov  eax,[var1+8]
    9. mov  edx,[var1+12]
    10. mov  [ecx+8],eax
    11. mov  [ecx+12],edx
    12.  
    13. sub  esp,16
    14. mov  edi,esp
    15. mov  esi,var2
    16. mov  ecx,4
    17. repe movsd
    18.  
    19. mov  eax,[pCol]
    20. call [eax+IHTMLElementCollection.item]
     
  11. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    ай, спасибо! надоумил!

    работает!