нужно вызвать метод item. в msdn вызов описан так: Код (Text): HRESULT item( VARIANT name, VARIANT index, IDispatch **pdisp ); т.е. необходимо передать два варианта. так вот возникает вопрос - а как их передать? засунуть в стэк всю структуру (32 байта)? потому что если передавать указатель, то метод возвратит ошибку...
походил я по коду в оле. похоже что именно саму структуру и нужно передавать. но вот как ее скормить coinvoke?
обнаружил еще один момент. после возврата из метода, стек уменьшается на 24 байта. то что он уменьшается не удивительно, но я считал что уменьшаться он должен на 56 байт: вместо двух вариантов по 32 байта мы передаем два их адреса по 4 байта. т.е. (32-4)+(32-4)=56 а получается странная арифметика: 32-4-4=24
Вообще-то, это stdcall, стек уменьшает метод item. То есть, при укладке в стек двух структур и указателя стек должен уменьшиться на 36 байт, а после вызова (и возврата из) метода он должен выровняться. Если же он увеличивается, то ты кладёшь 12 байт, а нужно именно 36 (структуры копируются, а не кладутся указатели на них). Если уменьшается - значит, кладёшь больше, чем необходимо (36+24=60 байт).
хех.. mov eax, sizeof (VARIANT) показывает 16 (десятичных) так что с арифметикой порядок выходит: (16-4)+(16-4)=24 гут кое что прояснилось... а вот теперь вопрос в том как правильно уложить эти структуры в стек: двордами или байтами? сначала или с конца структуры?
Без разницы. Быстрее, конечно, по 4 дворда, с начала, конечно: (fasm) Код (Text): push esp,pDisp sub esp,10h mov ecx,esp mov eax,[var1] mov edx,[var1+4] mov [ecx],eax mov [ecx+4],edx mov eax,[var1+8] mov edx,[var1+12] mov [ecx+8],eax mov [ecx+12],edx sub esp,16 mov edi,esp mov esi,var2 mov ecx,4 repe movsd mov eax,[pCol] call [eax+IHTMLElementCollection.item]