Проблема VC++ 6.0 -> VC++ 7.0
От: ikarm Россия  
Дата: 01.08.05 09:54
Оценка:
Приветствую!
У меня есть следующая проблема: при переносе кода с VC++ 6.0 на VC++ 7.0 появляется ошибка,
когда из созданного потока надо передать сообщение.
Вот кусок кода:

hWnd = AfxGetMainWnd()->m_hWnd;
f (hWnd)
SendMessage(hWnd, WM_USER_THREAD_LONTAG, (WPARAM)LONTAG_OP_ADDREF, (LPARAM)this);

При этом возникает следующая ошибка:
Unhandled exception at 0x00431328 in LnsOpcServer.exe: 0xC0000005: Access violation reading location 0x00000020.

Мне кажется, что AfxGetMainWnd() выдает не то, что надо.

02.08.05 12:02: Перенесено модератором из 'C/C++' — Odi$$ey
Re: Проблема VC++ 6.0 -> VC++ 7.0
От: Аноним  
Дата: 01.08.05 10:14
Оценка:
Здравствуйте, ikarm, Вы писали:

I>Приветствую!

I>У меня есть следующая проблема: при переносе кода с VC++ 6.0 на VC++ 7.0 появляется ошибка,
I>когда из созданного потока надо передать сообщение.
I>Вот кусок кода:

I>hWnd = AfxGetMainWnd()->m_hWnd;

I>f (hWnd)
I> SendMessage(hWnd, WM_USER_THREAD_LONTAG, (WPARAM)LONTAG_OP_ADDREF, (LPARAM)this);

А мне кажется, что беда с this. У тебя объект существует? (this != 0 ???)
Re[2]: Проблема VC++ 6.0 -> VC++ 7.0
От: ikarm Россия  
Дата: 01.08.05 11:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, ikarm, Вы писали:


I>>Приветствую!

I>>У меня есть следующая проблема: при переносе кода с VC++ 6.0 на VC++ 7.0 появляется ошибка,
I>>когда из созданного потока надо передать сообщение.
I>>Вот кусок кода:

I>>hWnd = AfxGetMainWnd()->m_hWnd;

I>>f (hWnd)
I>> SendMessage(hWnd, WM_USER_THREAD_LONTAG, (WPARAM)LONTAG_OP_ADDREF, (LPARAM)this);

А>А мне кажется, что беда с this. У тебя объект существует? (this != 0 ???)


Конечно существует. Я переписал:
CWnd* pCwnd = AfxGetMainWnd();
if (pCwnd)
SendMessage(pCwnd->m_hWnd, WM_USER_THREAD_LONTAG, (WPARAM)operation, (LPARAM)object);

Оказалось, что не существует pCwnd. Почему? Не могу понять.
Главное окно программы есть, метод вызывается только после того,
как появится главное окно по нажатию на кнопку...
Re: Проблема VC++ 6.0 -> VC++ 7.0
От: Denwer Россия  
Дата: 01.08.05 11:10
Оценка:
Здравствуйте, ikarm, Вы писали:

I>Приветствую!

I>У меня есть следующая проблема: при переносе кода с VC++ 6.0 на VC++ 7.0 появляется ошибка,
I>когда из созданного потока надо передать сообщение.
I>Вот кусок кода:

I>hWnd = AfxGetMainWnd()->m_hWnd;

I>f (hWnd)
I> SendMessage(hWnd, WM_USER_THREAD_LONTAG, (WPARAM)LONTAG_OP_ADDREF, (LPARAM)this);

I>При этом возникает следующая ошибка:

I>Unhandled exception at 0x00431328 in LnsOpcServer.exe: 0xC0000005: Access violation reading location 0x00000020.

I>Мне кажется, что AfxGetMainWnd() выдает не то, что надо.


В новой MFC небольшие отличаи, а именно AfxGetMainWnd() из неосновного потока ворачивает NULL. Что делать поищи в MSDN.
Re: Проблема VC++ 6.0 -> VC++ 7.0
От: esquire Россия  
Дата: 02.08.05 07:31
Оценка:
Здравствуйте, ikarm, Вы писали:

I>Мне кажется, что AfxGetMainWnd() выдает не то, что надо.


AfxGetMainWnd() выдает указатель на окно НЕ главного окна приложения, а главного окна текущего потока.
Т.о. если поток рабочий, то у него нет своего окна.

Используй AfxGetApp()->m_hMainWnd
Пилите гирю знаний, она золотая! (с) В.М.Лушин
Re[2]: Проблема VC++ 6.0 -> VC++ 7.0
От: esquire Россия  
Дата: 02.08.05 07:32
Оценка:
Здравствуйте, esquire, Вы писали:

E>Используй AfxGetApp()->m_hMainWnd


m_pMainWndНу, ты понял.
Пилите гирю знаний, она золотая! (с) В.М.Лушин
Re[2]: Проблема VC++ 6.0 -> VC++ 7.0
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 02.08.05 08:00
Оценка:
Здравствуйте, esquire, Вы писали:

E>AfxGetMainWnd() выдает указатель на окно НЕ главного окна приложения,


ой-ли?

AfxGetMainWnd:

Return Value

If the server has an object that is in-place active inside a container, and this container is active, this function returns a pointer to the frame window object that contains the in-place active document.

If there is no object that is in-place active within a container, or your application is not an OLE server, this function simply returns the m_pMainWnd of your application object.

If AfxGetMainWnd is called from the application's primary thread, it returns the application's main window according to the above rules. If the function is called from a secondary thread in the application, the function returns the main window associated with the thread that made the call.

Remarks

If your application is not an OLE server, then calling this function is equivalent to directly referring to the m_pMainWnd member of your application object.


E>а главного окна текущего потока.


а что это такое?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Проблема VC++ 6.0 -> VC++ 7.0
От: esquire Россия  
Дата: 02.08.05 11:39
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, esquire, Вы писали:


E>>AfxGetMainWnd() выдает указатель на окно НЕ главного окна приложения,


OE>ой-ли?


_AFXWIN_INLINE CWnd* AFXAPI AfxGetMainWnd()
    { CWinThread* pThread = AfxGetThread();
        return pThread != NULL ? pThread->GetMainWnd() : NULL; }


Копаем дальше...

CWinThread* AFXAPI AfxGetThread()
{
    // check for current thread in module thread state
    AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
    CWinThread* pThread = pState->m_pCurrentWinThread;

    // if no CWinThread for the module, then use the global app
    if (pThread == NULL)
        pThread = AfxGetApp();

    return pThread;
}



E>>а главного окна текущего потока.


OE>а что это такое?


Нуу, о чем-то таком писал Дж.Рихтер.
Для вас ведь не секрет, что у потока может быть очередь сообщений?
У рабочего потока — есть ОчС, но нет главного окна, а у интерфейсного потока — есть и ОчС и ГлО
Пилите гирю знаний, она золотая! (с) В.М.Лушин
Re[3]: Проблема VC++ 6.0 -> VC++ 7.0
От: esquire Россия  
Дата: 02.08.05 11:41
Оценка: 10 (1) +1
Здравствуйте, Odi$$ey, Вы писали:

Да вот, вы же и сами цитируете MSDN

OE>

If AfxGetMainWnd is called from the application's primary thread, it returns the application's main window according to the above rules. If the function is called from a secondary thread in the application, the function returns the main window associated with the thread that made the call.

Пилите гирю знаний, она золотая! (с) В.М.Лушин
Re[4]: Проблема VC++ 6.0 -> VC++ 7.0
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 02.08.05 17:04
Оценка:
Здравствуйте, esquire, Вы писали:

E>>>а главного окна текущего потока.

OE>>а что это такое?

а, блин, дошло, этож MFC-шное m_pMainWnd по закрытию которого убивается поток но его ручками надо назначать для каждого потока, чтоб AfxGetMainWnd() потом его возвращала.

E>Нуу, о чем-то таком писал Дж.Рихтер.


Рихтер врядли, он вроде про MFC не писал.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.