Адрес item'а интерфейса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Адрес item'а интерфейса

Сообщение ANDLL » 18.10.2004 (Пн) 14:12

Имеется интерфейс, объявленый как
Код: Выделить всё
interface IWinThunder: IUnknown
{
   HRESULT Begin([in]long Value);
}

Иммется ссылка на этот интерфейс. Как написать аналог для строки thrd->Begin();?
Код: Выделить всё
typedef HRESULT __stdcall XXX(long);

long WINAPI Thunder_Begin(IWinThunder thrd)
{
   unsigned long n_lng;
   //thrd->Begin(12);
   DWORD lpAddr;
   lpAddr=(long)thrd+12;
   lpAddr=*(long*)lpAddr;
   ((XXX*)lpAddr)(12);
}

На последней строке программа вылетает. Мне нужно, что бы в lpAddr находился адрес функции.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.10.2004 (Пн) 14:44

Э... AddressOf?
Lasciate ogni speranza, voi ch'entrate.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2004 (Пн) 14:51

Да. AddressOf для элемента интерфейса.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 14:54

На VB-то?
Задачу поподробней, плз...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2004 (Пн) 15:26

Нет, не на вб. На C++. Я привел пример кода, который должен, в принципе, работать, ан нет: не работает.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.10.2004 (Пн) 15:40

ANDLL писал(а):
Код: Выделить всё
long WINAPI Thunder_Begin(IWinThunder thrd)
{
   unsigned long n_lng;
   //thrd->Begin(12);
   DWORD lpAddr;
   lpAddr=(long)thrd+12;
   lpAddr=*(long*)lpAddr;
   ((XXX*)lpAddr)(12);
}


thrd - это адрес объекта
в первом DWORD-е по этому адресу лежит адрес VTBL
так что имхо так:
Код: Выделить всё
long WINAPI Thunder_Begin(IWinThunder thrd)
{
   //thrd->Begin(12);
   DWORD lpAddr=*(DWORD*)thrd; //указывает на VTBL
   lpAddr=lpAddr+12; //указывает на адрес метода
   lpAddr=*(DWORD*)lpAddr;
   ((XXX*)lpAddr)(12);
}

Проверь так.
Изображение

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 18.10.2004 (Пн) 15:41

ANDLL писал(а):Нет, не на вб. На C++. Я привел пример кода, который должен, в принципе, работать, ан нет: не работает.



Указатель и адрес функции разные вещи

Честно говоря непонятно что ты хочешь с этого заполучить?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 15:50

А зачем такой изврат? :)

Ну вот так:
Код: Выделить всё
lpAddr=(thrd->Begin);

Не уверен, нужны ли скобки.

Фишка в том, что в C++ имя функции без скобок суть адрес функции.


ЗЫ: адрес функции - это указатель на функцию :) И никак иначе...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 15:55

А про ручной дереференс vTable см. тут :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2004 (Пн) 16:03

2GSerg: thrd->Begin не работает. Я и сам удивился, код\гп узнал. Пишет, мол type_cast error...
2tyomitch: твой код тоже вылетает.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.10.2004 (Пн) 16:08

"код\гп" - кошмар :-)
ANDLL, дай сколько-нибудь рабочий тестовый пример, чтобы телепатической отладкой не заниматься ;-)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 16:08

Ну естественно нужно вручную кастовать адрес функции к типу DWORD!
Ну или сразу объявлять lpAddr как XXX...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.10.2004 (Пн) 16:12

А, да ведь надо же ещё и this передавать! Совсем забыл сначала...
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2004 (Пн) 16:12

Гм. Вручную это как? (DWORD)(thrd->Begin). Это очевидно, но тоже не работает. А как еще можно? использовать ???_cast?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2004 (Пн) 16:16

2tyomitch: в точку :!: Если переопределить XXX как XXX(long,long), то все действительно работает! Вопрос: А ЗАЧЕМ ЕГО ПЕРЕДАВАТЬ? Где тут логика?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 16:19

Блин :)
Ведь у меня же это даже в статье написано :)

Любой метод любого интерфейса имеет первый неявный параметр - сам этот интерфейс. Просто в C++ это прячется благодаря define.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.10.2004 (Пн) 16:20

Чтобы метод мог получить доступ к локальным переменным того объекта, у когорого он вызван.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2004 (Пн) 18:30

Гм. Все равно, логики я здесь не вижу...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 19:50

Наоборот, именно это логично...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.10.2004 (Пн) 21:39

ANDLL, как по-твоему метод узнаёт, у какого объекта он вызван?
Т.е. пусть есть код:
Код: Выделить всё
Private m_Var As Long

Public Sub Foobar
    MsgBox m_Var
End Sub


- как код метода Foobar должен узнать, где именно в памяти хранится переменная m_Var?

Вот именно для того, чтобы он это мог узнать, в него передаётся "невидимый" параметр this.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 19.10.2004 (Вт) 11:16

Гм. может и логично. А если так:
Код: Выделить всё
class XX
{
private: long item;
public: void method();
}

//...

XX Y;
Y.method()

Y тоже неявно передается this???
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.10.2004 (Вт) 13:25

Ага...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 19.10.2004 (Вт) 14:19

А я то думал... Жаль.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList