2014 dxdy logo

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

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




На страницу 1, 2, 3, 4  След.
 
 Замена указателя this в static функции
Сообщение27.11.2012, 18:31 
Может, кто подскажет как вызвать указатель this в static-функции, там его нету. Или что можно использовать вместо this? Как получить указатель программы на себя?

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

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:20 
Указателя this в static методе нет и не будет по определению указателя this и static метода. Чтобы иметь указатель this, метод должен быть не static.

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

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:31 
Спасибо!
дык в том-то и проблема. Что нужен контейнер для объекта, каковым является 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 
Я бы все-таки посоветовал четко обозначить язык, который Вы используете, и проблему, с которой столкнулись, поскольку пока все это выглядит как набор малоосмысленных буквосочетаний (простите).

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:39 
EtCetera, c++
Проблему расшифровал в дополнении. Спасибо.

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:50 
Код не приведете? Просто предпоследний Ваш абзац ввергает меня в состояние транса.

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 20:53 
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 
Этот код Вас не смущает?
Используется синтаксис C++
        lpConCont = NULL;
        // ...
        hr = lpConPoint->Advise(this, &dwConPointID);

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 21:05 
Они разные. Там lpConCont, а там lpConPoint
Cont - указатель контейнера, Point - указатель точки входа

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 21:40 
Извиняюсь за невнимательность.
Кажется, я понял, что Вы хотите. Для работы Вам нужно иметь класс-приемник, удовлетворяющий интерфейсу IDispatch. Не знаю, почему Вы так хотите, чтобы объектом-приемником был тот объект, в методе которого и устанавливается соединение (использование указателя this), ну да ладно. Так или иначе, класс-приемник должен корректно (вероятно, в этом и кроется ошибка) реализовывать интерфейс IDispatch. Если Вы не знаете, как его корректно реализовать, возможно, стоит воспользоваться функцией CreateStdDispatch (которая создает для объекта класса, реализующего интерфейс IUnknown, некую стандартную реализацию IDispatch).

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 21:54 
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 
Ну, допустим, вот это
temp03 в сообщении #650675 писал(а):
ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup
является ошибкой сборки (у Вас, скорее, всего осталось наименование WinMain, в то время как для консольного приложения требуется просто main), а не времени выполнения. О каком переполнении стека тут может идти речь (если есть ошибки еще на этапе сборки), не понимаю.

 
 
 
 Re: Замена указателя this в static функции
Сообщение27.11.2012, 22:03 
не не не не не...
Эту ошибку я так и не смог победить и пересоздал консольное приложение с нуля. Там всё переделал уже в консоли. И вот такой результат.

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

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

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

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

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

-- Вт ноя 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  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group