2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4  След.
 
 Замена указателя this в static функции
Сообщение27.11.2012, 18:31 
Заблокирован


16/06/09

1547
Может, кто подскажет как вызвать указатель this в static-функции, там его нету. Или что можно использовать вместо this? Как получить указатель программы на себя?

Вопрос 2 как вариант решения вопроса 1: как создать iUnknown-интерфейс в консоли?

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:20 
Заслуженный участник


04/05/09
4587
Указателя this в static методе нет и не будет по определению указателя this и static метода. Чтобы иметь указатель this, метод должен быть не static.

Остальные вопросы не понял.

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:31 
Заблокирован


16/06/09

1547
Спасибо!
дык в том-то и проблема. Что нужен контейнер для объекта, каковым является this. Но его нету, нужна замена. Ей может быть только iUnknown интерфейс. Походу получается что нужно создавать экземпляр iUnknown в консольном приложении и использовать его в качестве замены this для windows-приложения. я правильно мыслю?

-- Вт ноя 27, 2012 21:34:33 --

В общем, открою карты: мне нужно использовать метод IConnectionPoint :: Advise внешнего объекта. Делаю на IDispatch? Возникает переполнение стека. Хотя ни компилятор, ни компоновщик не ругаются. Ошибка вылетает уже на exe-стадии.
В Windows-версии всё нормально. А консоль упрямится.
_______________

Как решал:
функцию с this обернул в нестатическую обёртку и всё это запихал внутрь экземпляра IDispatch (с прочими необходимыми методами, которых оказалось штук 5!). Это из-за одного слова this пришлось переопределять 5 методов! :evil:
Но нихрена не пошло. Компилятор и компоновщик не ругаются, принимают this, а при выполнении exe - ошибка переполнения стека. :x

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:34 
Заслуженный участник


28/04/09
1933
Я бы все-таки посоветовал четко обозначить язык, который Вы используете, и проблему, с которой столкнулись, поскольку пока все это выглядит как набор малоосмысленных буквосочетаний (простите).

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:39 
Заблокирован


16/06/09

1547
EtCetera, c++
Проблему расшифровал в дополнении. Спасибо.

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:50 
Заслуженный участник


28/04/09
1933
Код не приведете? Просто предпоследний Ваш абзац ввергает меня в состояние транса.

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:53 
Заблокирован


16/06/09

1547
EtCetera, да конечно, спасибо! Вот код:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
        hr = CoCreateInstance(CLSID_Object, NULL, CLSCTX_ALL,__uuidof(IObj), (LPVOID*)&oPointer);               // создаёт экземпляр объекта по CLSID и возвращает интерфейс в pointer
        if (FAILED(hr)){
                MessageBox(0,L"Can't create object",L"error",MB_OK);
                goto Uninit;
        }
        IConnectionPointContainer*      lpConCont = NULL;
        hr = oPointer->QueryInterface(IID_IConnectionPointContainer, (void**)&lpConCont);                                       // получили ссылку на интерфейс IConnectionPointContainer для Object в lpConCont
        if (hr != S_OK)
                return hr;

        hr = lpConCont->FindConnectionPoint(DIID__Interface, &lpConPoint);                                                      // получаем точку подключения к интерфейсу DIID__Interface
        lpConCont->Release();                                                                                                                                                                   // освобождаем контейнер
        lpConCont = NULL;
        if (hr != S_OK)
                return hr;

        hr = lpConPoint->Advise(this, &dwConPointID);                                                                                                                   // устанавливает соединение между точкой подключения и приёмником
 


Приёмником как раз в windows-версии и является this, т.е. объект класса IDispatch и всё работает, а в консоли - ошибка.

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 21:02 
Заслуженный участник


28/04/09
1933
Этот код Вас не смущает?
Используется синтаксис C++
        lpConCont = NULL;
        // ...
        hr = lpConPoint->Advise(this, &dwConPointID);

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 21:05 
Заблокирован


16/06/09

1547
Они разные. Там lpConCont, а там lpConPoint
Cont - указатель контейнера, Point - указатель точки входа

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 21:40 
Заслуженный участник


28/04/09
1933
Извиняюсь за невнимательность.
Кажется, я понял, что Вы хотите. Для работы Вам нужно иметь класс-приемник, удовлетворяющий интерфейсу IDispatch. Не знаю, почему Вы так хотите, чтобы объектом-приемником был тот объект, в методе которого и устанавливается соединение (использование указателя this), ну да ладно. Так или иначе, класс-приемник должен корректно (вероятно, в этом и кроется ошибка) реализовывать интерфейс IDispatch. Если Вы не знаете, как его корректно реализовать, возможно, стоит воспользоваться функцией CreateStdDispatch (которая создает для объекта класса, реализующего интерфейс IUnknown, некую стандартную реализацию IDispatch).

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 21:54 
Заблокирован


16/06/09

1547
EtCetera в сообщении #650660 писал(а):
Не знаю, почему Вы так хотите, чтобы объектом-приемником был тот объект, в методе которого и устанавливается соединение (использование указателя this), ну да ладно.
почему же не хочу? С удовольствием :-) У меня есть консольное приложение. я в нём реализую приёмник как объект IDispatch -> ошибка. Т.е. в приложении есть child-класс MyIDispatch, в нём соответствующие методы. Т.к. функция, означенная выше является также методом данного класса, то соответственно вызывается this.
Если возможно другое решение - в студию! Будем благодарны.
EtCetera в сообщении #650660 писал(а):
Так или иначе, класс-приемник должен корректно (вероятно, в этом и кроется ошибка) реализовывать интерфейс IDispatch.
он и реализовывает, но в Windows-приложении. Стоит перейти в консоль - вылазит "ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup" - и поскакало-поехало! В общем, ошибка переполнения стека в конце, когда прочие условия соблюдены. :?
EtCetera в сообщении #650660 писал(а):
Если Вы не знаете, как его корректно реализовать, возможно, стоит воспользоваться функцией CreateStdDispatch (которая создает для объекта класса, реализующего интерфейс IUnknown, некую стандартную реализацию IDispatch).
да я попробую, только чем это будет отличаться от стандартного Dispatch'а? Ведь тоже самое, не?

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 22:01 
Заслуженный участник


28/04/09
1933
Ну, допустим, вот это
temp03 в сообщении #650675 писал(а):
ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup
является ошибкой сборки (у Вас, скорее, всего осталось наименование WinMain, в то время как для консольного приложения требуется просто main), а не времени выполнения. О каком переполнении стека тут может идти речь (если есть ошибки еще на этапе сборки), не понимаю.

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 22:03 
Заблокирован


16/06/09

1547
не не не не не...
Эту ошибку я так и не смог победить и пересоздал консольное приложение с нуля. Там всё переделал уже в консоли. И вот такой результат.

В WinMain'е всё замечательно! Песни поют, музыка играет. Но стоит перейти в консоль......
Консольный дубликат не хочет работать с Dispatch'ем (хотя ни линкер, ни компоновщик не ругаются, ругается уже Windows)

И даже HRESULT обычно содержит ошибку на отладке, а здесь не - здесь просто вылетает ошибка стека виндосовская.

Используется синтаксис C++
Необработанное исключение в "0x1024c0d2 (msvcr100d.dll)" в "console2.exe": 0xC00000FD: Stack overflow.

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 22:14 
Заслуженный участник


28/04/09
1933
Т.е. оконное приложение не только собирается, но и работает? А консольный вариант не хочет работать, так?

 Профиль  
                  
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 22:15 
Заблокирован


16/06/09

1547
да.

-- Вт ноя 27, 2012 23:42:34 --

Поменял сейчас IDispatch на IUnknown - ноль, ничего не дало. То же самое

-- Вт ноя 27, 2012 23:44:07 --

В общем меня бы устроило любой способ выполнения

Используется синтаксис C++
hr = lpConPoint->Advise(this, &dwConPointID);

в Console Application. Хоть там будет 100 классов! Вот этой единственной строчки, всё остальное можно забыть и выкинуть.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу 1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group