errox Geschrieben 29. Juni 2009 Teilen Geschrieben 29. Juni 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2009 Teilen Geschrieben 29. Juni 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
errox Geschrieben 29. Juni 2009 Autor Teilen Geschrieben 29. Juni 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2009 Teilen Geschrieben 29. Juni 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
errox Geschrieben 29. Juni 2009 Autor Teilen Geschrieben 29. Juni 2009 In der Funktion wird eine Textbox geöffnet. d.H. öffnet sich eine textbox, wenn sich das programm öffnet. Beim Autostart nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2009 Teilen Geschrieben 29. Juni 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
errox Geschrieben 29. Juni 2009 Autor Teilen Geschrieben 29. Juni 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2009 Teilen Geschrieben 29. Juni 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
errox Geschrieben 30. Juni 2009 Autor Teilen Geschrieben 30. Juni 2009 Wieso wird eigentlich ein anderes verzeichniss benutzt? ist doch unlogisch Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 30. Juni 2009 Teilen Geschrieben 30. Juni 2009 Wieso wird eigentlich ein anderes verzeichniss benutzt? Schau dir das Verzeichnis an, welches benutzt wird, vielleicht ist es dann logischer für dich. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Juni 2009 Teilen Geschrieben 30. Juni 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
errox Geschrieben 30. Juni 2009 Autor Teilen Geschrieben 30. Juni 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 30. Juni 2009 Teilen Geschrieben 30. Juni 2009 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Juni 2009 Teilen Geschrieben 30. Juni 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
errox Geschrieben 1. Juli 2009 Autor Teilen Geschrieben 1. Juli 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Juli 2009 Teilen Geschrieben 1. Juli 2009 Application.StartupPath Property (System.Windows.Forms) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
errox Geschrieben 1. Juli 2009 Autor Teilen Geschrieben 1. Juli 2009 Ich will nicht unverschämt wirken oder so, aber was soll mir das bringen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 2. Juli 2009 Teilen Geschrieben 2. Juli 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.