save-Datei soll durch Doppleklick Programm starten und angezeigt werden
-
Hallo.
Mein Programm ein MFC-SDI Programm zeigt beim ersten Start einen Willkommensbildschirm.
Wenn der Anwender den Willkommensbildschirm mit einem Klick auf O.K. bestätigt
schreibt mein Programm eine Datei in das Verzeichnis der Festplatte in der das Programm liegt.Bei einem erneuten Start schaut das Programm nach ob die entsprechende Datei existiert und weiss so ob es schon mal gestartet wurde oder nicht und zeigt dementsprechend den Willkommensbildschirm an oder auch nicht.
Das funktioniert gut.
Nun zum Problem.
Wenn ich eine Zeitlang mit dem Programm gearbeitet habe kann ich die Daten die ich mit dem Programm erzeugt habe auch abspeichern. Im „speichern unter„ Dialogfenster wähle ich das Verzeichnis in dem mein Programm liegt und speichere dort meine erzeugten Daten ab.
Wenn ich nun einen Doppelklick auf die soeben abgelegte Datei mache soll mein Programm starten und die abgespeicherten Daten anzeigen.
Das Programm startet auch aber es erscheint der Willkommensbildschirm obwohl sich die Datei die signalisiert das das Programm schon mal gestartet war sich im selben Verzeichnis wie die Datendatei befindet.Mache ich einen Doppelklick auf die „exe“ startet das Programm so wie es soll. Es merkt an der Datei die beim ersten starten erzeugt wurde das es schon mal gelaufen ist. Mache ich aber eine Doppelklick auf die Datei mit den gespeicherten Daten so ignoriert mein Programm die Datei die anzeigt das das Programm ja schon mal gelaufen ist und zeigt jedes Mal den Willkommensbildschirm.
Damit das Programm durch einen Doppelklick auf eine save-Datei startet habe ich folgende Codezeilen benutzt.
BOOL CMyZettelApp::InitInstance() { ... EnableShellOpen(); RegisterShellFileTypes(TRUE); ... }Geht das vielleicht auch anders?
zardoz
-
Wie regelst Du denn das Command-Line Parsing?
-
Hallo Martin Richter .
Zu der Frage „Wie regelst Du denn das Command-Line Parsing?“
Ich bin ziemlich neu im C++ Programmieren und regele das deswegen gar nicht oder besser gesagt ich kann damit gar nichts anfangen.Laut dem Buch „Inside Visual C++ 6.0“ von D. Kruglinski und G. Shepard und...
Sollte das was ich als Code eingefügt habe eigentlich reichen.zardoz
-
Dann zeige doch mal Deine ganze InitInstance als Code!
-
Hallo Martin.
Hier ist die InitInstance.BOOL CMyProgApp::InitInstance() { // OLE-Bibliotheken initialisieren if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); // Standardinitialisierung // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen // ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden // spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen. #ifdef _AFXDLL Enable3dControls(); // Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen #else Enable3dControlsStatic(); // Diese Funktion bei statischen MFC-Anbindungen aufrufen #endif // Ändern des Registrierungsschlüssels, unter dem unsere Einstellungen gespeichert sind. // ZU ERLEDIGEN: Sie sollten dieser Zeichenfolge einen geeigneten Inhalt geben // wie z.B. den Namen Ihrer Firma oder Organisation. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Standard INI-Dateioptionen laden (einschließlich MRU) // Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen // dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyZettelDoc), RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster RUNTIME_CLASS(CMyZettelView)); pDocTemplate->SetContainerInfo(IDR_CNTR_INPLACE); AddDocTemplate(pDocTemplate); EnableShellOpen(); RegisterShellFileTypes(TRUE); // Befehlszeile parsen, um zu prüfen auf Standard-Umgebungsbefehle DDE, Datei offen CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Verteilung der in der Befehlszeile angegebenen Befehle if (!ProcessShellCommand(cmdInfo)) return FALSE; // Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; }Da müsste eigentlich alles drin sein.
zardoz