15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Thread Message Map error

Ed Rapoport -- ehud@advn.com
Thursday, December 21, 1995

Hi,

I'm trying to use PostThreadMessage(.) in MFC environment, but cannot insert
the message in the message map. I get compile error "error C2642: cast to
pointer to member must be from related pointer to member". Any ideas ?

I'm using VC++ 4.0.  My application has many threads. The thread class is
derived from CWinThread. I added new sub and put messages in the maps as
shown in the following segments:

=====> .h file
(note:  I also tried LRESULT and LPARAM instead of LONG and WPARAM for UINT)
. . . . 
// Implementation
public:
	// Generated message map functions
	//{{AFX_MSG(CSocketThread)
	//}}AFX_MSG
	afx_msg LONG PrepareToSend(UINT wParam, LONG lParam); <====== the error

	DECLARE_MESSAGE_MAP()

====> .cpp file
(note:  the message number is temporary for testing)

IMPLEMENT_DYNAMIC(CSocketThread, CWinThread)

BEGIN_MESSAGE_MAP(CSocketThread, CWinThread)
	//{{AFX_MSG_MAP(CSocketThread)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_USER+1995,  PrepareToSend)
END_MESSAGE_MAP()

. . . . . . .
LONG CSocketThread::PrepareToSend(UINT wParam, LONG lParam)
{
	::MessageBeep(MB_OK);	//ER122095
	return 0;
}
. . . . .

Thanks,
Ed




Mike Blaszczak -- mikeblas@msn.com
Saturday, December 23, 1995

You can't use message maps in non CWnd-derived objects. I've fixed this for a 
future version of MFC, but until that's released I think you'll need to rely 
on overriding PreTranslateMessage() for your CWinThread.

.B ekiM
----------
From: 	owner-mfc-l@netcom.com on behalf of Ed Rapoport
Sent: 	Thursday, December 21, 1995 13:49
To: 	mfc-l@netcom.com
Subject: 	Thread Message Map error

Hi,

I'm trying to use PostThreadMessage(.) in MFC environment, but cannot insert
the message in the message map. I get compile error "error C2642: cast to
pointer to member must be from related pointer to member". Any ideas ?

I'm using VC++ 4.0.  My application has many threads. The thread class is
derived from CWinThread. I added new sub and put messages in the maps as
shown in the following segments:

=====> .h file
(note:  I also tried LRESULT and LPARAM instead of LONG and WPARAM for UINT)
. . . . 
// Implementation
public:
	// Generated message map functions
	//{{AFX_MSG(CSocketThread)
	//}}AFX_MSG
	afx_msg LONG PrepareToSend(UINT wParam, LONG lParam); <====== the error

	DECLARE_MESSAGE_MAP()

====> .cpp file
(note:  the message number is temporary for testing)

IMPLEMENT_DYNAMIC(CSocketThread, CWinThread)

BEGIN_MESSAGE_MAP(CSocketThread, CWinThread)
	//{{AFX_MSG_MAP(CSocketThread)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_USER+1995,  PrepareToSend)
END_MESSAGE_MAP()

. . . . . . .
LONG CSocketThread::PrepareToSend(UINT wParam, LONG lParam)
{
	::MessageBeep(MB_OK);	//ER122095
	return 0;
}
. . . . .

Thanks,
Ed





Ken Freeman -- kfreeman@viewlogic.com
Tuesday, December 26, 1995

Mike Blaszczak wrote:
> 
> You can't use message maps in non CWnd-derived objects. I've fixed this for a
> future version of MFC, but until that's released I think you'll need to rely
> on overriding PreTranslateMessage() for your CWinThread.
> 

Mike, what about other classes derived from CCmdTarget, such as CDocument?

Ken



Mike Blaszczak -- mikeblas@msn.com
Thursday, December 28, 1995

Err, sorry, I sort of misspoke.

You can use message maps in any CCmdTarget-derived class.  You can add 
handlers in those message maps for command messages in any CCmdTarget-derived 
class. You can't add generic message handlers for any class not derived from 
CWnd.

That is, ON_COMMAND_MESSAGE() will work in CCmdTarget and anything below it.  
ON_MESSAGE() (or specialized versions of it, like ON_WM_PAINT()) will only 
work in CWnd-derived classes.  ON_COMMAND_MESSAGE() is usable in a message map 
for a CWinThread, but ON_MESSAGE() won't work in a message map attached to a 
CWinThread.

You should try to find the time to read the definitions for these macros in 
the headers. There's a pointer to a member function cast in there that's part 
of the trouble. The other problem is that MFC's message pump ignores thread 
messages.

I checked, and this is fixed for MFC 4.2.  I guess you should expect MFC 4.2 
in June or July if Microsoft keeps shipping updates every four months (that 
is, if I don't go postal and wipe out everybody in the cafeteria one fine 
day).

.B ekiM
TCHAR szDisclaimer[] = _T("These words are my own; I do not speak for 
Microsoft.")

----------
From: 	owner-mfc-l@netcom.com on behalf of Ken Freeman
Sent: 	Tuesday, December 26, 1995 07:46
To: 	mfc-l@netcom.com
Subject: 	Re: Thread Message Map error

Mike Blaszczak wrote:
> 
> You can't use message maps in non CWnd-derived objects. I've fixed this for 
a
> future version of MFC, but until that's released I think you'll need to rely
> on overriding PreTranslateMessage() for your CWinThread.
> 

Mike, what about other classes derived from CCmdTarget, such as CDocument?

Ken




Stephen Keeler -- keelers@igs.net
Thursday, December 28, 1995

> Err, sorry, I sort of misspoke.
> 
[  clipped a couple paragraphs... ]
> 
> You should try to find the time to read the definitions for these
> macros in the headers. There's a pointer to a member function cast
> in there that's part of the trouble. The other problem is that MFC's
> message pump ignores thread messages.
> 

What I'd love to see is better macro documentation in the help files, 
books online, etc.

[ more stuff clipped... ]
> 
> .B ekiM
> TCHAR szDisclaimer[] = _T("These words are my own; I do not speak
> for Microsoft.")
> 

Regards,

Stephen Keeler
On-Line Systems Inc.



Stephan
Wednesday, January 03, 1996


Ed:

Your problem is that only CWnd-derived objects can receive messages, so you 
can not do an ON_MESSAGE() inside a class which does not have CWnd in its 
parent heirarchy.  This should make intuitive sense:  only windows can 
receive Window messages, after all.

The completely unintuitive "cast to pointer to member must be from related 
pointer to member" is the result of the expansion of your PrepareToSend 
function name within the ON_MESSAGE macro;  it wants the function to be a 
member of a CWnd class (ie, CWnd::PrepareToSend(UINT, LONG)), but in your 
case, it does not, so the type cast fails.


Good luck,
Stephan!
 ----------
I'm trying to use PostThreadMessage(.) in MFC environment, but cannot insert
the message in the message map. I get compile error "error C2642: cast to
pointer to member must be from related pointer to member". Any ideas ?

I'm using VC++ 4.0.  My application has many threads. The thread class is
derived from CWinThread. I added new sub and put messages in the maps as
shown in the following segments:

=====> .h file
(note:  I also tried LRESULT and LPARAM instead of LONG and WPARAM for UINT)
. . . .
// Implementation
public:
     // Generated message map functions
     //{{AFX_MSG(CSocketThread)
     //}}AFX_MSG
     afx_msg LONG PrepareToSend(UINT wParam, LONG lParam); <====== the error

     DECLARE_MESSAGE_MAP()

====> .cpp file
(note:  the message number is temporary for testing)

IMPLEMENT_DYNAMIC(CSocketThread, CWinThread)

BEGIN_MESSAGE_MAP(CSocketThread, CWinThread)
     //{{AFX_MSG_MAP(CSocketThread)
     //}}AFX_MSG_MAP
     ON_MESSAGE(WM_USER+1995,  PrepareToSend)
END_MESSAGE_MAP()

. . . . . . .
LONG CSocketThread::PrepareToSend(UINT wParam, LONG lParam)
{
     ::MessageBeep(MB_OK);    //ER122095
     return 0;
}
. . . . .

Thanks,
Ed






| Вернуться в корень Архива |