Приветствую!
У меня есть следующая проблема: при переносе кода с 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 ???)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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. Почему? Не могу понять.
Главное окно программы есть, метод вызывается только после того,
как появится главное окно по нажатию на кнопку...
Здравствуйте, 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.
Здравствуйте, ikarm, Вы писали:
I>Мне кажется, что AfxGetMainWnd() выдает не то, что надо.
AfxGetMainWnd() выдает указатель на окно НЕ главного окна приложения, а главного окна текущего потока.
Т.о. если поток рабочий, то у него нет своего окна.
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.
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, esquire, Вы писали:
E>>AfxGetMainWnd() выдает указатель на окно НЕ главного окна приложения,
OE>ой-ли?
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 appif (pThread == NULL)
pThread = AfxGetApp();
return pThread;
}
E>>а главного окна текущего потока.
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.
Здравствуйте, esquire, Вы писали:
E>>>а главного окна текущего потока. OE>>а что это такое?
а, блин, дошло, этож MFC-шное m_pMainWnd по закрытию которого убивается поток но его ручками надо назначать для каждого потока, чтоб AfxGetMainWnd() потом его возвращала.
E>Нуу, о чем-то таком писал Дж.Рихтер.