Member function not declared

What is missing in this code?

I get a C2509 compile time error saying:" 'OnCopyData': member function not declared in 'CmfclDlg'"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
BOOL CmfclDlg::OnCopyData( CWnd *pWnd, COPYDATASTRUCT *pReq)

{
	

	char				cMsg[256]	= { 0 };
	CString				cResp;
	COPYDATASTRUCT		resp;

	if ( pReq )
	{
		if( pReq->cbData && pReq->lpData)
		{
			strncpy( cMsg, (char*)pReq->lpData, pReq->cbData >= sizeof( cMsg ) ? sizeof ( cMsg ) - 1 : pReq->cbData );
			SetDlgItemText( IDC_REQUEST, cMsg);
		}
		if ( pReq->dwData )
		{
			GetDlgItemText( IDC_RESPONSE, cResp);
			strcpy( cMsg, cResp.GetBuffer( sizeof ( cMsg )));

			resp.dwData = (DWORD)GetSafeHwnd();
			resp.cbData = strlen( cMsg );
			resp.lpData = (PVOID)&cMsg[0];

			::SendMessage( (HWND)(pReq->dwData), WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&resp );
			SetDlgItemText( IDC_STATUS, "Response sent.");

		}
		else
		{
			SetDlgItemText( IDC_STATUS, "No dwData found.");
		}
	}
	else
	{
		SetDlgItemText( IDC_STATUS, "No COPYDATASTRUCT found.");
	}
	return( TRUE );
}


I got this off of davidjwalling.com to try to help me understand how MFC and .NET interacted.
Is OnCopyData() declared in CmfclDlg? You should check the CmfclDlg class and see.
All class members shall be declared in class definition.
Here is the whole cpp file. I am brand new to MFC and do not know where I should be looking.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
// mfclDlg.cpp : implementation file
//

#include "stdafx.h"
#include "mfcl.h"
#include "mfclDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CmfclDlg dialog




CmfclDlg::CmfclDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CmfclDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CmfclDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CmfclDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_SEND1, &CmfclDlg::OnBnClickedSend1)
	ON_BN_CLICKED(IDC_CANCEL1, &CmfclDlg::OnBnClickedCancel1)
END_MESSAGE_MAP()


// CmfclDlg message handlers

#define SetDlgItemText
BOOL CmfclDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	SetDlgItemText( IDC_STATUS, "Enter data for response.");
	SetDlgItemText( IDC_RESPONSE, "ACK");

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CmfclDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CmfclDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CmfclDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CmfclDlg::OnBnClickedSend1()
{
	// TODO: Add your control notification handler code here
	COPYDATASTRUCT cds;
	SetDlgItemText(IDC_STATUS,"Sending Message ...");
	cds.dwData = 1;
	cds.cbData = 5;
	cds.lpData = (LPVOID)"Test\0";

	SendMessage ( WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&cds);
	SetDlgItemText( IDC_STATUS,"Message Sent.");
}

void CmfclDlg::OnBnClickedCancel1()
{
	// TODO: Add your control notification handler code here
	SetDlgItemText(IDC_REQUEST,"");
	SetDlgItemText(IDC_RESPONSE,"");
	SetDlgItemText(IDC_STATUS,"Enter data for response.");
	
	SendMessage( WM_SETFOCUS, IDC_RESPONSE, 0L);

}

BOOL CmfclDlg::OnCopyData( CWnd *pWnd, COPYDATASTRUCT *pReq)

{
	

	char				cMsg[256]	= { 0 };
	CString				cResp;
	COPYDATASTRUCT		resp;

	if ( pReq )
	{
		if( pReq->cbData && pReq->lpData)
		{
			strncpy( cMsg, (char*)pReq->lpData, pReq->cbData >= sizeof( cMsg ) ? sizeof ( cMsg ) - 1 : pReq->cbData );
			SetDlgItemText( IDC_REQUEST, cMsg);
		}
		if ( pReq->dwData )
		{
			GetDlgItemText( IDC_RESPONSE, cResp);
			strcpy( cMsg, cResp.GetBuffer( sizeof ( cMsg )));

			resp.dwData = (DWORD)GetSafeHwnd();
			resp.cbData = strlen( cMsg );
			resp.lpData = (PVOID)&cMsg[0];

			::SendMessage( (HWND)(pReq->dwData), WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&resp );
			SetDlgItemText( IDC_STATUS, "Response sent.");

		}
		else
		{
			SetDlgItemText( IDC_STATUS, "No dwData found.");
		}
	}
	else
	{
		SetDlgItemText( IDC_STATUS, "No COPYDATASTRUCT found.");
	}
	return( TRUE );
}


Thanks for your answers already though!
Ryan Jantz wrote:
I get a C2509 compile time error saying:" 'OnCopyData': member function not declared in 'CmfclDlg'"


This basically tells you that the OnCopyData doesn't exist as a member of CmfclDlg. There is a way to tell if it exists the way you have it by opening up the class declaration which should be located in the mfclDlg.h header. This should contain all of the class members that are valid. It's possible the OnCopyData exists in the class as a function, but the call could be incorrect. Is it possible that you're using an old version of the header file? Did you get the header file from the same place you got the example from?

I know that MFC is a Microsoft thing, and that they have a wizard for the console projects, but if you happened to copy your code from somewhere, it's possible it uses an older/updated version of mfclDlg.h than the one that is supplied with your compiler.

My only suggestion is to try to narrow down the possibilities. Make sure the files came from the same place and haven't been updated since.
I thought that OnCopyData was part of the MFC initial setup. Intellesense provided that function when I was typing. That is why I am not sure where to look. OnCopyData is part of <afxwin.h> that is included in the <stdafx.h>. Any other ideas?
I'm sorry, a lot of us don't use the MFC since it's a mix between console apps and the windows gui, a microsoft specific implementation, and only supported by the MSVS suites.
@Volatile Pulse,

Your idea about looking in the header was correct. I added

BOOL OnCopyData( CWnd *pWnd, COPYDATASTRUCT *pReq);

in the .h file and that worked. Thanks for your help.
That's not quite the way to do it...but if you have no issues with it, it's quite possible something got lost between one of the versions? But it's really not supposed to work correctly just by adding one line like that.

Glad you got it to work regardless though.
Topic archived. No new replies allowed.