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