2014 dxdy logo

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

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




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

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

EtCetera, отправил

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 16:35 
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 
Что касается Вашего консольного варианта:
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 
неужели сделали :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


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