tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
18
ZUGRIFFE
1376
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    derfragende79 derfragende79 ist offline Mitglied Bronze
    Registriert seit
    Feb 2005
    Beiträge
    45
    Hallo zusammen,

    Ich habe eine kleine MFC Applikation in der ein Thread gestartet wird, der wiederum im ursprünglichen gestarteten Fenster (CMainFrame) eine Methode aufrufen soll. Irgendwie schaffe ich es nicht exakt dieses Objekt wieder zu bekommen.
    Wie schaffe ich es eine Änderung genau an diesem CMainFrame vorzunehmen der nach dem initialisieren der Anwendung aufgerufen wurde?

    Grüße
     

  2. #2
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Es wäre besser gewesen wenn du die Frage im MFC Forum gestellt hättest.


    mfg
    umbrasaxum
     

  3. #3
    derfragende79 derfragende79 ist offline Mitglied Bronze
    Registriert seit
    Feb 2005
    Beiträge
    45
    Sorry versehen.
     

  4. #4
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Is ja nicht schlimm, nur da wird dir sicherlich schneller geholfen werden.


    mfg
    umbrasaxum
     

  5. #5
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Der Gag ist, dass bei MFC vom MainFrame zwar ein Pointer auf das CWnd* (m_pMainWnd) in der App aufbewahrt wird, aber eben nicht auf deine davon abgeleitete Klasse.
    Also baue einfach selbst in der App eine neue Membervariable von deinem MainFrame-Typ und an der Stelle in CWinApp::InitInstance, wo der MainFrame erzeugt wird, setze den Pointer da drauf. Dann kannst du immer mit theApp.m_pMeinMainFrame auf die Funktionen zugreifen.

    In der xxxapp.h also:

    class CMeineApp
    {

    ...

    CMeinMainFrame* m_pMainFrame;

    ...

    }

    in der InitInstance:

    // vorher:
    m_pMainWnd = new CMainFrame

    // jetzt neu:
    m_pMeinMainFrame = new CMainFrame
    m_pMainWnd = m_pMeinMainFrame;
     

  6. #6
    derfragende79 derfragende79 ist offline Mitglied Bronze
    Registriert seit
    Feb 2005
    Beiträge
    45
    (Achtung Dummiealarm)

    Danke erstmal für deine schnelle Antwort. Aber leider konnte ich in keiner der Klassen etwas wie
    Code :
    1
    
    new CMainFrame
    finden.

    Meine Vermutung ist das sich die Sache irgendwo hier:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    [size=2]pDocTemplate = [/size][size=2][color=#0000ff]new[/color][/size][size=2] BsDocTemplate(
     
    IDR_MAINFRAME,
     
    RUNTIME_CLASS(CMFCStartUpDoc),
     
    RUNTIME_CLASS(CMainFrame), [/size][size=2][color=#008000]// main SDI frame window
     
    [/color][/size][size=2]RUNTIME_CLASS(CMFCStartUpView));
     
    AddDocTemplate(pDocTemplate);
     
    [/size]

    aber dort kann ich nur Klassennamen angeben und keine Objekte hineintun.


    Grüße

    -------------------------------------------------------------------------------------------------------------
    Solche Fragen kommen zustande wenn man nur Java lernt.
     

  7. #7
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Das sollte eigentlich direkt unter dem Template-Erzeugen und den AddDocTemplate-Aufrufen stehen. Post mal einfach die komplette InitInstance aus deiner CxxxApp (mit Source-Tags bitte). Muss da drin sein, wenn du SDI oder MDI gewählt hast.
     

  8. #8
    derfragende79 derfragende79 ist offline Mitglied Bronze
    Registriert seit
    Feb 2005
    Beiträge
    45
    Code :
    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
    
    [size=2]BOOL CMFCStartUpApp::InitInstance()
     
    {
     
    AfxEnableControlContainer();
     
    [/size][size=2][color=#008000]// Standard initialization
     
    [/color][/size][size=2][/size][size=2][color=#008000]// If you are not using these features and wish to reduce the size
     
    [/color][/size][size=2][/size][size=2][color=#008000]// of your final executable, you should remove from the following
     
    [/color][/size][size=2][/size][size=2][color=#008000]// the specific initialization routines you do not need.
     
    [/color][/size][size=2][color=#0000ff]#ifdef[/color][/size][size=2] _AFXDLL
     
    [/size][size=2][color=#008000]//Enable3dControls(); // Call this when using MFC in a shared DLL
     
    [/color][/size][size=2][color=#0000ff]#else
     
    [/color][/size][size=2][/size][size=2][color=#008000]//Enable3dControlsStatic(); // Call this when linking to MFC statically
     
    [/color][/size][size=2][color=#0000ff]#endif
     
    [/color][/size][size=2][/size][size=2][color=#008000]// Change the registry key under which our settings are stored.
     
    [/color][/size][size=2][/size][size=2][color=#008000]// TODO: You should modify this string to be something appropriate
     
    [/color][/size][size=2][/size][size=2][color=#008000]// such as the name of your company or organization.
     
    [/color][/size][size=2]SetRegistryKey(_T("Local AppWizard-Generated Applications"));
     
    LoadStdProfileSettings(); [/size][size=2][color=#008000]// Load standard INI file options (including MRU)
     
    [/color][/size][size=2][/size][size=2][color=#008000]// Register the application's document templates. Document templates
     
    [/color][/size][size=2][/size][size=2][color=#008000]// serve as the connection between documents, frame windows and views.
     
    // CSingleDocTemplate* pDocTemplate;
     
    [/color][/size][size=2]BsDocTemplate* pDocTemplate;
     
    [/size][size=2][color=#008000]// The standard MFC DocTemplate has an error.
     
    // As result there is impossible to start hiding program
     
    // without flipping.
     
    // pDocTemplate = new CSingleDocTemplate(
     
    [/color][/size][size=2]pDocTemplate = [/size][size=2][color=#0000ff]new[/color][/size][size=2] BsDocTemplate(
     
    IDR_MAINFRAME,
     
    RUNTIME_CLASS(CMFCStartUpDoc),
     
    RUNTIME_CLASS(CMainFrame), [/size][size=2][color=#008000]// main SDI frame window
     
    [/color][/size][size=2]RUNTIME_CLASS(CMFCStartUpView));
     
    AddDocTemplate(pDocTemplate);
     
    [/size][size=2][color=#008000]// Parse command line for standard shell commands, DDE, file open
     
    [/color][/size][size=2]CCommandLineInfo cmdInfo;
     
    ParseCommandLine(cmdInfo);
     
    [/size][size=2][color=#008000]// Dispatch commands specified on the command line
     
    [/color][/size][size=2][/size][size=2][color=#0000ff]if[/color][/size][size=2] (!ProcessShellCommand(cmdInfo))
     
    [/size][size=2][color=#0000ff]return[/color][/size][size=2] FALSE;
     
    [/size][size=2][color=#008000]// The one and only window has been initialized, so show and update it.
     
    // m_pMainWnd->ShowWindow(SW_SHOW);
     
    // m_pMainWnd->UpdateWindow();
     
    [/color][/size][size=2]
     
    m_pMainWnd->ShowWindow(SW_HIDE);
     
    [/size][size=2][color=#0000ff]return[/color][/size][size=2] TRUE;
     
    }
     
    [/size]
    Ich hoffe, dass das ist was sie gemeint haben. Grüße
     

  9. #9
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Oh, da hat aber einer fleissig umgebaut. Dieses m_pMainWnd ganz unten, das dürfte der Pointer auf dein Mainframe sein. Allerdings wird der in der Methode hier tatsächlich nicht erzeugt.

    Such mal danach, irgendwo muss der ja zugewiesen werden, an der Stelle solltest du auch dann deinen Pointer darauf setzen können.

    Alternativ kannst du guten Glaubens einfach davon ausgehen, dass das dein MainFrame ist, und den wieder hoch-casten:

    m_pMeinMainFrame = (CMainFrame*)m_pMainWnd;
     

  10. #10
    derfragende79 derfragende79 ist offline Mitglied Bronze
    Registriert seit
    Feb 2005
    Beiträge
    45
    *frust**frust**frust**frust**frust**frust**frust**frust**frust**frust**frust**frust*

    Wie kann ich denn dann wieder von dem Thread auf den
    m_pMeinMainFrame
    zugreifen.

    Gruß
     

  11. #11
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Dann pack den m_pMeinMainFrame in deine CWinApp-Klasse rein.
    Du kannst in MFC überall mit "theApp" auf deine WinApp-Klasse zugreifen. Mach das Member public oder mach dir einen Getter.

    Um dann irgendwo drauf zuzugreifen, einfach:

    theApp.m_pMeinMainFrame->TuWas();
     

  12. #12
    derfragende79 derfragende79 ist offline Mitglied Bronze
    Registriert seit
    Feb 2005
    Beiträge
    45
    Für den Thread ist theApp, laut Compiler ein nicht deklarierter Bezeichner


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
     [size=2]
    VOID Thread (PVOID pvoid) 
     
    { 
    [size=2]//CMFCStartUpApp theApp;
     
    [/size]Sleep(5000); 
     
    CMainFrame *pFrame = [/size][size=2][color=#0000ff]new[/color][/size][size=2] CMainFrame;
     
    pFrame = theApp.m_pMeinMainFrame; 
     
    pFrame->OnCloseInst(); 
     
    } 
     
    [/size]

    Mit dem ausgeklammerten Zusatz läuft der Compiler durch, gibt aber bei der Ausführung einen Bösen absturz.

    Zur Info noch
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    [size=2][color=#0000ff]class[/color][/size][size=2] CMFCStartUpApp : [/size][size=2][color=#0000ff]public[/color][/size][size=2] CWinApp
     
    {
     
    [/size][size=2][color=#0000ff]public[/color][/size][size=2]:
     
    CMFCStartUpApp();
     
    CMainFrame *m_pMeinMainFrame;
     
    ...
    [/size]

    und aus MFCStartUp

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     
    ...
    [size=2][color=#008000]//CMainFrame *m_pMeinMainFrame = (CMainFrame*) m_pMainWnd; 
     
    [/color][/size][size=2]theApp.m_pMeinMainFrame = (CMainFrame*) m_pMainWnd;
     
    m_pMainWnd->ShowWindow(SW_HIDE);
     
    ...
    [/size]
     

  13. #13
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Es scheint also theApp zu kennen, jetzt ist die Frage, wo kommt der Absturz her?
    Ist der Pointer m_pMeinMainFrame ungültig oder etwas anderes? Zeig mal die Fehlermeldung.
     

  14. #14
    derfragende79 derfragende79 ist offline Mitglied Bronze
    Registriert seit
    Feb 2005
    Beiträge
    45
    Debug Assertion Failed!
    File: appcore.cpp
    Line: 242


    Bei Retry:
    Die Ausnahme "unknown software exception" (0x80000003) ist in der Anwendung an der Stelle 0x7c2ac2bf aufgetreten


    Bei Ignore:
    Die Anweisung in "0x00416d6b" verweist auf Speicher in "0xcccccccec". Der Vorgang "read" konte nicht auf dem Speicher durchgeführt werden.


    In beiden Fällen öffnet sich bei theApp. das Menü (in Java ist das ein Gutes zeichen) wenn "CMFCStartUpApp theApp;" im Thread auskomentiert ist
    dann erhalte ich "error c2065: 'theApp': nichtdeklarierter Bezeichner" und "error c2228: Der linke Teil von '.mp_MeinMainFrame' muss eine Klasse/Strukur/Union sein


    Kennen sie eine gute Seite mit einigen funktionsfähigen MFC-Beispielen? Ich kann mir nicht vorstellen, dass ich der erste bin der ein soleches Problem hat.

    Gruß
     

  15. #15
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Dann ist irgendwo was an dem Pointer faul.
    Wäre es möglich das Projekt (mit .dsp/.vcproj) hier gezippt zu attachen? Dann kann ich mal kurz drüberguggen und rausfinden, wo's hapert. Manchmal liegt der Fehler ganz woanders, als man eigentlich vermutet.

    Ansonsten, für MFC empfehle ich http://www.codeguru.com und http://www.codeproject.com. Diese sind teilweise sehr fortgeschritten, haben aber auch einfachere Beispiele.
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 17.10.06, 21:23
  2. Link soll im MainFrame öffnen. DW MX 2004
    Von Semjasa im Forum HTML-Editoren
    Antworten: 3
    Letzter Beitrag: 15.01.05, 23:41
  3. Antworten: 2
    Letzter Beitrag: 08.12.04, 18:54
  4. [MFC] Zugriff aus Thread auf Methoden
    Von thodtie im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 11.11.04, 15:00
  5. Antworten: 4
    Letzter Beitrag: 14.09.02, 21:28