ERLEDIGT
NEIN
NEIN
ANTWORTEN
18
18
ZUGRIFFE
1376
1376
EMPFEHLEN
-
16.02.05 14:38 #1
- 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
-
16.02.05 14:47 #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
-
16.02.05 14:53 #3
- Registriert seit
- Feb 2005
- Beiträge
- 45
Sorry versehen.
-
16.02.05 14:54 #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
-
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;
-
16.02.05 15:43 #6
- 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
finden.Code :1
new CMainFrame
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.
-
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.
-
17.02.05 07:48 #8
- Registriert seit
- Feb 2005
- Beiträge
- 45
Ich hoffe, dass das ist was sie gemeint haben. GrüßeCode :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]
-
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;
-
17.02.05 10:42 #10
- 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ß
-
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();
-
17.02.05 11:49 #12
- 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]
-
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.
-
17.02.05 13:15 #14
- 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ß
-
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
-
C# : Methoden mit Parametern als eigenen Thread Starten?
Von BeaTBoxX im Forum .NET CaféAntworten: 4Letzter Beitrag: 17.10.06, 21:23 -
Link soll im MainFrame öffnen. DW MX 2004
Von Semjasa im Forum HTML-EditorenAntworten: 3Letzter Beitrag: 15.01.05, 23:41 -
Thread soll auf nicht static Methoden/variablen zugreifen
Von JoeBloggs im Forum JavaAntworten: 2Letzter Beitrag: 08.12.04, 18:54 -
[MFC] Zugriff aus Thread auf Methoden
Von thodtie im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 11.11.04, 15:00 -
Java Applet Navigation soll Seiten in mainframe öffnen, wie?
Von sabi70 im Forum HTML-EditorenAntworten: 4Letzter Beitrag: 14.09.02, 21:28





Zitieren
Login






