2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 00:26 
В 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 
Так. А в оконном варианте какие отличия в WinMain?

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 00:37 
А там вообще всё интересно. Класс не мой, я его брал. Там главным является не 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 
Все начинает запутываться.
И все же,
EtCetera в сообщении #650779 писал(а):
в оконном варианте какие отличия в [функции] WinMain [по сравнению с функцией main в консольном варианте]?

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 00:59 
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 
temp03 в сообщении #650786 писал(а):
Ну главное отличие то, что выброшены все Windows-функции
Меня больше всего вот этот момент и интересует.
temp03 в сообщении #650786 писал(а):
Вместо этого есть один файл console.cpp в котором находятся функция void main() и функции-методы необходимые для работы класса MyIDispatch.
Я ошибаюсь, или еще вверху этой страницы он назывался main.cpp?

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 01:10 
EtCetera в сообщении #650787 писал(а):
Меня больше всего вот этот момент и интересует.

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

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 01:13 
Можете привести точный код функций WinMain() и main()?

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 01:18 
да сейчас. Но боюсь что там ничего интересного, это просто перечни функций.

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 01:24 
temp03 в сообщении #650792 писал(а):
Но боюсь что там ничего интересного, это просто перечни функций.
Посмотрим...

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 01:25 
значит, функции 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 
temp03 в сообщении #650795 писал(а):
функции WinMain() вообще нет
temp03 в сообщении #650795 писал(а):
Функция MyClass::Init() я точно передал выше. При отладке работа начинается с неё в окне.
Этого не может быть, потому что этого не может быть никогда. :-)

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 11:57 
Блин, вы CoInitialize где вообще вызываете?

 
 
 
 Re: Замена указателя this в static функции
Сообщение28.11.2012, 13:02 
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 
Если записать функцию 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  След.


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