2014 dxdy logo

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

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




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


16/06/09

1547
В main.cpp находится #include main.h
Далее void main() с процессом инициализации и перечнем вызываемых функций из класса. Далее сами функции тоже находятся в main.cpp после void main(). Функции определены так, как того требует синтаксис, сам компилятор указывает, что ему нужно (декларации, константы и т.д.).

Из класса используется одна-единственная функция Advise(), до остальных дело не успевает дойти. Вот и когда при отладке, всё инициализируется, всё проходит отлично и я уже получаю IConnectionPoint, необходимый для Advise(), т.е. указатель &lpConPoint - при отладке это особенно видно. Код hr = S_OK. Всё идёт замечательно. И вот при вызове Advise() ошибка.

Сам класс располагается в заголовочном файле main.h - Там декларации класса и его методов.

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


28/04/09
1933
Так. А в оконном варианте какие отличия в WinMain?

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


16/06/09

1547
А там вообще всё интересно. Класс не мой, я его брал. Там главным является не MyIDispatch, а его дочерний класс MyClass : public MyIDispatch:

Используется синтаксис C++
class MyClass :
        public MyIDispatch
{
private:
        void init();
public:
        MyClass (void){ init();};
        ~MyClass(void){};
        HRESULT objectCall                      (_bstr_t request );
};


файл MyClass.cpp имеет структуру:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include "MyClass.h"

void MyClass::init()
{
        WCHAR ver[16]={0};
        CreateHostWindow();   // в консоли нет
        SetWindowText(ver);   // в консоли нет
        SetWindowSize(550,600);   // в консоли нет
        CenterWindow();   // в консоли нет
        CreateInstance();
        Advise();
        AttachControl();

        WCHAR buf[MAX_PATH]={0};
        ::GetCurrentDirectory(MAX_PATH,buf);                                    // получили директорий
    lstrcat(buf,L"\\..\\common\\myfile");
        LoadObject(buf);

}
 


Далее...
Во вспомогательном файле MyiDispatch.cpp находится
Используется синтаксис C++
#include MyiDispatch.h
...
// список функций, которые вызываются init() из MyClass.cpp


Далее... файл MyiDispatch.h

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#pragma once
#include "windows.h"
#include "Oleauto.h"
#include "resource.h"
#include <iostream>
.....
#pragma comment(lib,"Version.lib")
//definitions
#define HOSTWINDOW_CLASS        L"AtlAxWin"
#define PROG_ID ........

//typedefs
typedef BOOL    (       WINAPI  *LPAtlAxWinInit          )();
typedef HRESULT (       WINAPI  *LPAtlAxAttachControl)(IUnknown* pControl, HWND hWnd, IUnknown** ppUnkContainer);
typedef VOID    (       WINAPI  *LPGetClassObject        )(REFCLSID rclsid, REFIID riid, LPVOID* ppv);

class MyIDispatch:      public  IDispatch
{
        protected:
        HWND                                            hWndHost;                               // идентификатор окна в Windows
        BOOL                                            isAttached;
        BOOL                                            isInit;
        BOOL                                            isLoaded;
        BOOL                                            isTransparent;
        SIZE                                            drawingSize;
        ......    
private:
        IViewObjectEx*                          view;
        static ATOM                                     RegisterHostWindowClass ();
        ............
public:
        // main window control interface
        DWORD dwThreadId;
        HWND hwndParent;
        ..........        // все эти переменные видны при отладке в this
        HRESULT CreateInstance();

        // common
        HRESULT LoadObject(WCHAR* szFileName);
        ............
        HRESULT Advise();
        // IDispatch methods
        STDMETHOD(QueryInterface)( REFIID riid, void ** ppvObject);
        ULONG STDMETHODCALLTYPE AddRef();
        ULONG STDMETHODCALLTYPE Release();
         .............
};
 

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


28/04/09
1933
Все начинает запутываться.
И все же,
EtCetera в сообщении #650779 писал(а):
в оконном варианте какие отличия в [функции] WinMain [по сравнению с функцией main в консольном варианте]?

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


16/06/09

1547
EtCetera в сообщении #650781 писал(а):
Все начинает запутываться.
И все же,
EtCetera в сообщении #650779 писал(а):
в оконном варианте какие отличия в [функции] WinMain [по сравнению с функцией main в консольном варианте]?
Ну главное отличие то, что выброшены все Windows-функции, а такие функции как CreateInstance и другие - внесены под void main(), т.е. убран файл MyClass.cpp и MyClass.h. Соответственно и у класса MyIDispatch нет потомков - т.е. всё упрощено.
Вместо этого есть один файл main.cpp в котором находятся функция void main() и функции-методы необходимые для работы класса MyIDispatch.

Далее... для функции Advise() создаётся экземпляр объекта MyIDispatch как:
Используется синтаксис C++
MyIDispatch* testObj = new MyIDispatch()
testObj -> Advise()
и она из него вызывается.
поэтому функция MyIDispatch::Advise() там сохранена и находится отдельно от main() как нестатическая.

Есть один-единственный #include main.h

В нём находятся необходимые #include (такие же как в оконной версии) и определение класса - такое же. Только без лишних (оконных) констант и функций. Сокращённый вариант

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


28/04/09
1933
temp03 в сообщении #650786 писал(а):
Ну главное отличие то, что выброшены все Windows-функции
Меня больше всего вот этот момент и интересует.
temp03 в сообщении #650786 писал(а):
Вместо этого есть один файл console.cpp в котором находятся функция void main() и функции-методы необходимые для работы класса MyIDispatch.
Я ошибаюсь, или еще вверху этой страницы он назывался main.cpp?

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


16/06/09

1547
EtCetera в сообщении #650787 писал(а):
Меня больше всего вот этот момент и интересует.

Это функции создания и обработки окна:
Используется синтаксис C++
CreateHostWindow();   // в консоли нет
        SetWindowText(ver);   // в консоли нет
        SetWindowSize(550,600);   // в консоли нет
        CenterWindow();
их нет. Они создают окно и устанавливают его параметры.
EtCetera в сообщении #650787 писал(а):
Я ошибаюсь, или еще вверху этой страницы он назывался main.cpp?
да да.. блин я уже запутался, щас исправлю

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


28/04/09
1933
Можете привести точный код функций WinMain() и main()?

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


16/06/09

1547
да сейчас. Но боюсь что там ничего интересного, это просто перечни функций.

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


28/04/09
1933
temp03 в сообщении #650792 писал(а):
Но боюсь что там ничего интересного, это просто перечни функций.
Посмотрим...

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


16/06/09

1547
значит, функции WinMain() вообще нет. Вместо неё MyClass::init()

вот моя функция void main():
Используется синтаксис C++
       
void main(){
        WCHAR ver[16]={0};
        CreateInstance();
        MyiDispatch* testObj = new MyiDispatch();
        testObj->AdviseSink();
        AttachControl();

        WCHAR buf[MAX_PATH]={0};
        ::GetCurrentDirectory(MAX_PATH,buf);                                    // получили директорий
    lstrcat(buf,L"\\..\\common\\myFile");
        LoadObject(buf);
}


Функция MyClass::Init() я точно передал выше. При отладке работа начинается с неё в окне.

-- Ср ноя 28, 2012 02:30:24 --

Если хотите, я могу вам выслать почтой оба варианта и вы посмотрите.

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


28/04/09
1933
temp03 в сообщении #650795 писал(а):
функции WinMain() вообще нет
temp03 в сообщении #650795 писал(а):
Функция MyClass::Init() я точно передал выше. При отладке работа начинается с неё в окне.
Этого не может быть, потому что этого не может быть никогда. :-)

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


09/09/10
3729
Блин, вы CoInitialize где вообще вызываете?

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


16/06/09

1547
EtCetera, извините за задержку! Приводил программу в удобочитаемый для вас вид. Убрал и закоментил всё лишнее, т.к. интерес заключается именно в функции Advise(). В проекте, который я вам послал, выполняются лишь две функции:
- инициализатор;
- Advise()
Разумеется, рабочие на моей машине.
Чтобы вам не пришлось много разбираться. Спасибо!

Joker_vD, это часть метода myIDispatch::createInstance():
Используется синтаксис C++
HRESULT MyIDispatch::CreateInstance()
{
        if(isInit)
                return S_FALSE;
        CoInitialize(NULL);
        HRESULT hr = CLSIDFromProgID(L"Your.Application", &clsidSrv);
        hr = ::CoCreateInstance(clsidSrv, NULL, CLSCTX_SERVER, IID_IUnknown, (void FAR* FAR*)&_object);
        isInit = hr == S_OK;
        return hr;
}

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


28/04/09
1933
Если записать функцию 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 (в обоих смыслах) не наблюдается. Хотя, конечно, говорить о том, что все работает правильно, я не могу.

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

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



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

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


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

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