Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo Ich hab ein Problem:

Ich hab ein Kassierprogramm in C++ .NET erstellt. Selbst funktionieren tut es Super. Blos sollte es beim Systemstart mitstarten ( Automatisch -> Autostart )

Ich benutze folgenden Pfad in der Registry: HKEY_LOCAL_MACHINE/SOFTWARE/Windows/CurrentVersion/Run

Das Programm startet, schön und gut aber ich hab folgendes Problem:

Ich hab eine Funktion die aufgerufen wird. ( Form onload )

	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 

			 {

				 try

				 {

					 load_config();

				 }

				 catch(...){}

			 }

Diese wird aufgerufen wenn ich das Programm so starte, aber NICHT wenn das Programm im Autostartmodus startet. Warum?

Liebe Grüße

errox

Geschrieben

Woraus folgerst du denn, dass die Funktion nicht aufgerufen wird? Mit dem Debugger kannst du es ja kaum geprüft haben.

Hier wäre vielleicht eine ordentliche Behandlung von Exceptions vorteilhaft. Das try/catch steht ja sicher nicht nur zum Spaß da. Momentan tust du im Fehlerfall einfach gar nichts. Das passt zum beobachteten Verhalten.

Geschrieben

Try / Catch ist nur da, weil load_config mit einer .NET funktion einen Ordner auslesen will. Wenn der Ordner nicht vorhanden ist, gibt es ja diese Fehlermeldung, die ich mit try / catch verhindern kann.

Geschrieben

Du hast meine Frage nicht beantwortet: Woraus schließt du, dass die Funktion nicht aufgerufen wird? Hast du das mit dem Debugger geprüft?

Oder ist es vielleicht einfach nur so, dass anscheinend etwas, das in dieser Funktion passieren sollte, nicht passiert, und du daraus folgerst, dass die Funktion nicht aufgerufen wird? Das kann aber auch andere Ursachen haben.

Es ist nicht gut, wenn du statt des tatsächlich beobachteten fehlerhaften Verhaltens deine Schlussfolgerungen hier reinstellst. Die können falsch sein, und damit lockst du jeden Helfer auf eine falsche Fährte.

Werden beim Laden der Konfiguration (wenn ich jetzt einfach mal nach dem Namen der aufgerufenen Funktion gehen darf) vielleicht irgendwelche relativen Pfade benutzt? Hast du daran gedacht, dass beim Aufruf aus dem Autostart möglicherweise ein anderes Arbeitsverzeichnis benutzt wird?

Geschrieben
In der Funktion wird eine Textbox geöffnet. d.H. öffnet sich eine textbox, wenn sich das programm öffnet.

Beim Autostart nicht.

Und diese Textbox steht ganz sicher nicht in irgendeinem bedingten Pfad des Programms, d.h. nicht in einem if- oder else-Block, in einer Schleife, oder in einem Teil, der möglicherweise durch eine Exception übersprungen wird?

Mach doch mal eine Ausgabe am Anfang von Form1_Load und load_config. Werden die angezeigt?

Geschrieben

		void load_config()

		{

			try

			{

				MessageBox::Show("Barakna","Session Wiederherstellen",MessageBoxButtons::YesNo,MessageBoxIcon::Exclamation);

				if(IO::File::Exists("config\\temp_boot"))

				{

					if(MessageBox::Show("Die Letze Session wurde nicht Vorschriftsgemäß beendet. \nMöchten sie sie wiederherstellen?","Session Wiederherstellen",MessageBoxButtons::YesNo,MessageBoxIcon::Exclamation) == ::DialogResult::Yes)

					{

"Barakna" wird angezeit. aber Die messagebox in der if clause nicht. Die Datei ist aber vorhanden. Wenn ich das Programm so starte, kommt die Messagebox. Im Autostart eintrag nicht. Die datei steht aber :(

Geschrieben

Soviel zu "die Funktion wird nicht ausgeführt" ;)

Wie gesagt, beschreibe das beobachtete Verhalten, nicht deine Interpretation.

Und es ist genau das, was ich vermutet hatte:

Werden beim Laden der Konfiguration (wenn ich jetzt einfach mal nach dem Namen der aufgerufenen Funktion gehen darf) vielleicht irgendwelche relativen Pfade benutzt? Hast du daran gedacht, dass beim Aufruf aus dem Autostart möglicherweise ein anderes Arbeitsverzeichnis benutzt wird?
Geschrieben

Wenn dein Programm nur dann funktioniert, wenn das Arbeitsverzeichnis auch das Programmverzeichnis ist, ist das ein Bug in deinem Programm. Bei einer sauberen Programmierung darfst du keinerlei Annahmen über das Arbeitsverzeichnis machen. Das kann alles mögliche sein, insbesondere wenn jemand dein Programm über die Eingabeaufforderung startet oder eigene Verknüpfungen anlegt. Zudem gibt es Windows-Funktionen, die das Arbeitsverzeichnis zur Laufzeit ändern können.

Relative Pfade haben da nichts zu suchen.

Geschrieben

Ich mach keine annahmen aus dem Arbeitsverzeichniss.


void load_config()

{

try

{

if(IO::File::Exists([B]"config\\temp_boot"[/B]))

{

........

Ich habs mal einfacher gemacht: Eine .bat Datei soll gestartet werden ( am Autostart )

Wenn ich die .bat Datei so starte, funktionierts.

Mit dem Autostarteintrag nicht.

Die .bat Datei beinhaltet nur den Pfad ( in dem fall L:\Programmierung\C++\Kassiersystem\release\Kassiersystem.exe )

Ich dreh noch durch

Geschrieben

Warum suchst du nicht einfach das Verzeichnis deiner Exe(dll) und gehst dann über den relativen Pfad?

Dann hast du das Problem nicht...

Anmerkung: Batchdateien zur Programmausführung müffeln. :floet:

Geschrieben
Ich mach keine annahmen aus dem Arbeitsverzeichniss.
Doch, machst du. Du benutzt einen relativen Pfad. Relative Pfade beziehen sich auf das Arbeitsverzeichnis. Also nimmst du an, dass unterhalb des Arbeitsverzeichnisses (das wie gesagt, alles mögliche sein kann) ein Unterverzeichnis config mit einer Datei temp_boot liegt.

Das trifft aber vermutlich nur dann zu, wenn das Arbeitsverzeichnis auch das Verzeichnis ist, in dem das Programm liegt.

Du triffst eine Annahme über das Arbeitsverzeichnis, und wenn diese nicht zutrifft, funktioniert dein Programm nicht.

Mit dem Autostarteintrag nicht.
Natürlich nicht, davon rede ich doch die ganze Zeit. Versuch bitte nicht, durch Herumfrickeln mit Verknüpfungen oder Batchdateien den Fehler in deinem Programm zu umgehen. Beheb ihn.
Geschrieben

Eine Lösung wäre es ja, wenn ich den Relativen Pfad ( "config\\temp_boot" ) duch den "Richtigen" ersetze ( "D:\...\config_\temp_boot")

Aber was mache ich, wenn das Programm auf einen anderen Rechner verwendet wird? ( Das tut es ). Da muss ich immer das Programm neu Kompilieren. Für jeden Rechner eine Version

Geschrieben
Ich will nicht unverschämt wirken oder so, aber was soll mir das bringen?

Du hast bisher nicht verraten, wo dieser Ordner config mit der Datei temp_boot liegt, aber ich nehme an, er liegt in dem Verzeichnis, in dem auch die Programmdatei liegt.

Du weißt natürlich zur Compilezeit nicht, welches Verzeichnis das ist. Aber mit dieser Funktion kannst du das zur Laufzeit herausbekommen.

An den zurückgegebenen String hängst du einfach config\temp_boot an, und schon hast du einen absoluten Pfad.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...