проблемма с IHTMLElementCollection::Item

Тема в разделе "WASM.WIN32", создана пользователем asmic, 12 июл 2007.

  1. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Кусок кода:
    Код (Text):
    1.     . . . . .
    2.     lea eax, pFelDisp  
    3.     push eax           ; IDispatch         
    4.     mov Form_Item_Var.vt, VT_I4
    5.     lea eax, iCount
    6.     mov Form_Item_Var.lVal, eax
    7.     lea eax, Form_Item_Var
    8.     push eax         ; name                                    
    9.     push eax         ; index
    10.     mov eax, pHEC
    11.     push eax
    12.     mov eax,[eax]
    13.     call dword ptr (IHTMLElementCollectionVtbl ptr [eax]).item
    14.     mov hr, eax
    15.     .IF eax != S_OK
    16.     . . . . .
    Подскажите пожалуйста, что в этом коде неправильно. В eax возвращается S_FALSE. Почему?
     
  2. IceStudent

    IceStudent Active Member

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

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    т.е. так:
    Код (Text):
    1.     lea eax, pFelDisp  
    2.     push eax           ; IDispatch            
    3.     mov Form_Item_Var.vt, VT_I4
    4.     lea eax, iCount
    5.     mov Form_Item_Var.lVal, eax
    6.     lea eax, Form_Item_Var
    7.     push eax         ; name и index                                    
    8.     mov eax, pHEC
    9.     push eax
    10.     mov eax,[eax]
    11.     call dword ptr (IHTMLElementCollectionVtbl ptr [eax]).item
    12.     mov hr, eax
    13.     .IF eax != S_OK
    этот код верен? если нет. я прошу помочь мне. напиши пожалуйста правильный код. ок. заранее спасибо.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Структуры VARIANT копируются целиком, они вроде по 16 байт размером. То есть, копируешь либо так:

    Код (Text):
    1. pushvar macro varl:REQ
    2.  push [varl+12]
    3.  push [varl+08]
    4.  push [varl+04]
    5.  push [varl+00]
    6. endm
    7. ..
    8.     lea eax, pFelDisp  
    9.     push eax           ; IDispatch            
    10.     mov Form_Item_Var.vt, VT_I4
    11.     mov eax, iCount
    12.     mov Form_Item_Var.lVal, eax
    13.     pushvar Form_Item_Var ; name
    14.     pushvar Form_Item_Var ; index
    15.     mov eax, pHEC
    16. ..
    Либо через cld + rep movsd, но можно легко запутаться в адресах.
     
  5. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    спасибо.
     
  6. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Добрый день. IceStudent, у меня по прежнему возвращает S_FALSE. Я пробовал делать как ты посоветовал. Но положительного результата нет. В чем дело? Я просто взамешательсте. Вот код:

    Код (Text):
    1.     pushvar macro varl:REQ
    2.       push [varl+12]
    3.       push [varl+08]
    4.       push [varl+04]
    5.       push [varl+00]
    6.     endm
    7. ..............
    8.  
    9.  
    10.  
    11.     lea eax, pFelDisp          
    12.     push eax
    13.     mov Form_Item_Var.vt, VT_I4
    14.     lea eax, iCount
    15.     mov Form_Item_Var.lVal, eax
    16.     pushvar Form_Item_Var
    17.     pushvar Form_Item_Var
    18.     mov eax, pHEC
    19.     push eax
    20.     mov eax,[eax]
    21.     call dword ptr (IHTMLElementCollectionVtbl ptr [eax]).item
    22.     mov hr, eax
    23.  
    24.  
    25. ..............
    Почему в call dword ptr (IHTMLElementCollectionVtbl ptr [eax]).item мне возвращается S_FALSE. Посмотрите пожалуйста верен ли вобще мой код. Всё ли я сделал правильно для того чтобы получить get_action? Если есть ошибки исправьте пожалуйста и обьясните как будет верно. Заранее спасибо.
     
  7. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Неужели никто не знает как помочь мне?????
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    А с чего это все должны Вам помогать?
     
  9. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    А для чего нужен этот форум? Для того чтобы помогать друг другу. Или я не прав? Я ведь не прошу написать мне готовую программу. Я прошу помочь мне найти и исправить ошибку в коде. Если ты не знаешь как мне помочь. То лучше вобще ничего не пиши.
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Помогать newbie стать беспощадным даосом -- дело хорошее, но вот писать за кого-то программы -- уж извините.

    P.S. финт по делу: можно быстренько написать маленький сэмпл на С, скомпилировать его cl /Fa и посмотреть ассемблерный листинг -- все станет ясно.

    P.S.1
    И не надо так орать, это вам не служба поддержки, толку от этого никакого не будет, один негатив.
     
  11. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    у меня нет MSVC ( да и отношение к C у меня.... :)). Если ты знаешь в чем дело. Помоги пожалуйста. Я уже и в ольге смотрел и куда только не лазил. Я запутался. И не могу понять где ошибка. Заранее спасибо.
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    asmic
    Почему в call dword ptr (IHTMLElementCollectionVtbl ptr [eax]).item мне возвращается S_FALSE.
    Например
    Код (Text):
    1. ...
    2.   lea eax, iCount       ;; !!! получить _адрес_, а надо значение
    3.   mov Form_Item_Var.lVal, eax
    4. ...
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    + IceStudent #4 использовал mov, а не lea
     
  14. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    спасибо. буду пробовать. потом отпишу.
     
  15. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Даже если я использую mov вместо lea, все равно возвращаемое значение S_FALSE. Почему так, что в моем коде неправильно. Подскажите пожалуйста.
     
  16. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  17. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Я видел эту ошибку. Я исправил lea eax, iCount на mov eax, iCount. Но все равно результат отрицательный. Так и не могу найти ошибку.
     
  18. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  19. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    спасибо. обязательно попробую. потом отпишу о результатах.
     
  20. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Всем добрый вечер. Я разобрался с проблеммой.
    Этот вариант работает:

    Код (Text):
    1.     lea eax, pFelDisp
    2.     push eax
    3.     push 0
    4.     push 0
    5.     push 0
    6.     push 0
    7.     push 0
    8.     push iCount
    9.     push 0
    10.     push 3
    11.     mov eax, pHEC
    12.     push eax
    13.     mov eax,[eax]
    14.     call dword ptr (IHTMLElementCollectionVtbl ptr [eax]).item
    15.     mov hr, eax
    Всем спасибо за вашу помощь.