S
Da ich noch nicht wirklich weiter gekommen bin, hab ich mal versucht das Problem auf ein einfaches Beispiel zu reduzieren. Hab mit Visual Studio ein neues MFC Projekt angelegt. Eine Form hat ein Button "Firmware Update". Dort soll die Funktion firmwareupdate in der FirmwareUpdate.cpp gestartet werden. Damit die Funktion Statusmeldungen direkt darstellen kann, habe ich auch eine Listbox in diese Form gesetzt. Diese (bzw. das aufrufende Objekt) soll der Funktion übergeben werden, damit diese weiß, wo die Meldungen angezeigt werden sollen. Leider bekomme ich die Fehlermeldung:
firmwareupdate.cpp(10): error C2027: Verwendung des undefinierten Typs
"CmfcTest1Dlg"
Obwohl ich in der Header die Klasse als Prototyp deklariert habe, wenn ich statt der Prototypen Deklaration den Header der Klasse inkludiere gibt es diverse andere Fehler.. was mache ich falsch? Vielleicht ist mein Konzept ja voll daneben , würde mich freuen, wenn mich jemand in die richtig Richtung bringt.
Code ist wie folgt (mfcTest1Dlg.h):
// mfcTest1Dlg.h: Headerdatei
//
#pragma once
#include "afxwin.h"
// CmfcTest1Dlg-Dialogfeld
class CmfcTest1Dlg : public CDialogEx
{
// Konstruktion
public:
CmfcTest1Dlg(CWnd* pParent = NULL); // Standardkonstruktor
// Dialogfelddaten
enum { IDD = IDD_MFCTEST1_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
// Implementierung
protected:
HICON m_hIcon;
// Generierte Funktionen für die Meldungstabellen
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedFwupdate();
afx_msg void OnLbnSelchangeList1();
CListBox m_RecievedData;
};
Die zugehörige cpp datei:
// mfcTest1Dlg.cpp: Implementierungsdatei
//
#include "stdafx.h"
#include "mfcTest1.h"
#include "mfcTest1Dlg.h"
#include "afxdialogex.h"
#include "FirmwareUpdate.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Dialogfelddaten
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
// Implementierung
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CmfcTest1Dlg-Dialogfeld
CmfcTest1Dlg::CmfcTest1Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CmfcTest1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CmfcTest1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_RecievedData);
}
BEGIN_MESSAGE_MAP(CmfcTest1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_FWUpdate, &CmfcTest1Dlg::OnBnClickedFwupdate)
ON_LBN_SELCHANGE(IDC_LIST1, &CmfcTest1Dlg::OnLbnSelchangeList1)
END_MESSAGE_MAP()
// CmfcTest1Dlg-Meldungshandler
BOOL CmfcTest1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
// wenn das Hauptfenster der Anwendung kein Dialogfeld ist
SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden
// TODO: Hier zusätzliche Initialisierung einfügen
m_RecievedData.AddString( L"a" );
return TRUE; // TRUE zurückgeben, wenn der Fokus nicht auf ein Steuerelement gesetzt wird
}
void CmfcTest1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// Wenn Sie dem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie
// den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das
// Dokument/Ansicht-Modell verwenden, wird dies automatisch ausgeführt.
void CmfcTest1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // Gerätekontext zum Zeichnen
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Symbol in Clientrechteck zentrieren
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;
// Symbol zeichnen
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// Die System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer
// das minimierte Fenster mit der Maus zieht.
HCURSOR CmfcTest1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CmfcTest1Dlg::OnBnClickedFwupdate()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
firmwareUpdate(this);
}
FirmwareUpdate.h:
#ifndef __FIRMWAREUPDATE_H_
#define __FIRMWAREUPDATE_H_
//#include "mfcTest1Dlg.h"
//Prototyp der Klasse
class CmfcTest1Dlg;
//Prototyp der Funktion
int firmwareUpdate(CmfcTest1Dlg * resultobjekt);
#endif
und die FirmwareUpdate.cpp:
#include "stdafx.h"
#include "FirmwareUpdate.h"
class CmfcTest1Dlg;
int firmwareUpdate(CmfcTest1Dlg * resultobjekt);
int firmwareUpdate(CmfcTest1Dlg * resultobjekt)
{
resultobjekt->m_RecievedData.AddString( L"Info: starte Firmware Update" );
return 3;
}