2014 dxdy logo

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

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




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


16/06/09

1547
пришлю сейчас. То что вы написали, это интересно.

-- Ср ноя 28, 2012 15:17:14 --

EtCetera, отправил

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


16/06/09

1547
EtCetera в сообщении #650906 писал(а):
Если записать функцию main() для консольного варианта (который Вы почему-то не прислали, а именно ее реализация меня и интересовала) следующим образом:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
void main()
{
        char title[500];

        GetConsoleTitleA(title, 500);

        HWND hwndConsole = FindWindowA(NULL, title);
        HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwndConsole, GWL_HINSTANCE);
        HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST));

        MSG msg;
       
        CoInitialize(NULL);

        MyIDispatch* myIDispatch = new MyIDispatch();

        myIDispatch->CreateInstance();
        myIDispatch->Advise();
        while (GetMessage(&msg, NULL, 0, 0))
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }
        CoUninitialize();
}

...то никакого переполнения стека при вызове метода Advise (в обоих смыслах) не наблюдается. Хотя, конечно, говорить о том, что все работает правильно, я не могу.

Спасибо огромное! Попробовал ваш вариант, с той разницей, что вместо IDC_TEST поставил 109, т.к. он у меня почему-то неопределён :?

Используется синтаксис C++
hr      0xc00000fd Не удается создать новую страницу защиты для стека.       HRESULT
 


-- Ср ноя 28, 2012 17:41:12 --

но мне почему-то кажется, то что вы предлагаете - это верный путь. Именно этой функции и не было в моём варианте, а в оконном была. Истина где-то рядом!

-- Ср ноя 28, 2012 17:46:11 --

EtCetera в сообщении #650906 писал(а):
...то никакого переполнения стека при вызове метода Advise (в обоих смыслах) не наблюдается. Хотя, конечно, говорить о том, что все работает правильно, я не могу.
так у вас на вашей машине тестирование показало что всё нормально?

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


28/04/09
1933
Что касается Вашего консольного варианта:
1. Зачем-то код из "MyIDispatch.h/cpp" перенесли в новые файлы, сделав заодно все члены класса MyIDispatch глобальными переменными. Зачем??? Так делать не нужно! Достаточно было убрать все, что касалось работы с окна и все, в остальном использовать тот же самый код.
temp03 в сообщении #650966 писал(а):
Попробовал ваш вариант, с той разницей, что вместо IDC_TEST поставил 109, т.к. он у меня почему-то неопределён :?
2. Попутно выкинули include'ы, в данном случае IDC_TEST был определен в "Resource.h".
3. Функция CreateInstance почему-то перестала быть членом класса (и теперь работает с глобальными переменными, см. п. 1), хотя она никому не мешала.
4. Функцию main вставили в тот же *.cpp-файл, в котором лежат определения функций-членов класса "нового" MyIDispatch. Это не ошибка, но неужели сложно было завести еще один *.cpp-файл, содержащий только функцию main?
5. Теперь ягодки. Ошибка, приводящая к переполнению стека, заключалась в том, что в функции MyIDispatch::QueryInterface строчки
Используется синтаксис C++
          *ppvObject = (void *)this;
ВНЕЗАПНО поменялись на
Используется синтаксис C++
          *ppvObject = (void *)QueryInterface(iid, ppvObject);
...что привело, разумеется, к бесконечной рекурсии и, соответственно, переполнению стека. Зачем нужно было трогать этот код, непонятно.

В общем, ужас. Прежде чем работать с таким кодом, неплохо бы подтянуть знания по ООП, WinAPI и работе Windows-приложений.
temp03 в сообщении #650966 писал(а):
Именно этой функции и не было в моём варианте, а в оконном была. Истина где-то рядом!
Какой "этой"?
temp03 в сообщении #650966 писал(а):
так у вас на вашей машине тестирование показало что всё нормально?
Работать-то программа работает, но вот правильно ли она работает, не знаю (я имею в виду свой вариант с циклом обработки сообщений, разумеется).

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


16/06/09

1547
неужели сделали :facepalm:
Вы не представляете, какое вам огромное спасибо! :appl:

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

А потом я вам задам целую кучу вопросов, если вы не против будете :-)


-- Ср ноя 28, 2012 23:47:36 --

EtCetera в сообщении #651195 писал(а):
ВНЕЗАПНО поменялись на
:shock: действительно!

-- Ср ноя 28, 2012 23:49:30 --

точнее, я сейчас поменял обратно на this, но у меня всё равно почему-то не работает hr в Advise() $\neq$ S_OK там какое-то число.

-- Ср ноя 28, 2012 23:53:32 --

Нет, извините. Понял. Беда в другом. Не нужно высылать, ваш вариант работает.

-- Ср ноя 28, 2012 23:59:44 --

Вы крутой человек, EtCetera, респект Вам.
Всё работает. Вопрос закрыт.

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

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



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

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


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

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