boomboomben
Goto Top

Programmabsturz bei Autostart durch Registry. Funktioniert nur mit Verknüpfung im Autostartordner

Hallo zusammen,

ich habe ein mehrwürdiges Verhalten mit meinem kleinen .Net basierten Tool.
Die ganze Zeit habe ich dieses auf verschiedenen Systemen einfach im Autostart verknüpft und es gab keine Probleme.
Nun habe ich eine Option eingefügt die unter "Lokal User" ....."run" einen Registryeintrag einfügt.

Soweit, so gut.

Das Programm startet bei normaler Ausführung durch den Benutzer zuverlässig. Auch per Debug im VS.
Wenn man nun jedoch das System neu startet und das Tool über die Registry gestartet wird, hängt es sich auf, bzw wird nicht gestartet.
Verknüpft man es alternativ im Autostartordner, funktioniert alles super.

Nun zur eigentlichen Frage:

Was ist anders, wenn ein Programm durch die Registry automatisch gestartet wird?

Content-ID: 317033

Url: https://administrator.de/contentid/317033

Ausgedruckt am: 24.11.2024 um 04:11 Uhr

eisbein
Lösung eisbein 06.10.2016 um 14:52:39 Uhr
Goto Top
Hallo!

Hast du irgendwo relative Pfade angegeben?
Bei Registry-Start sind absolute Pfade Pflicht!

Gruß
Eisbein
BoomBoomBen
BoomBoomBen 06.10.2016 um 15:15:13 Uhr
Goto Top
Ja, ich lese den Pfad aus und setze diesen ein. Der passt auch. Das Tool startet ja, wird aber gleich wieder beendet. Ich vermute irgebdwo bei der Erstellung des Tray Symbols. Werde nachher nochmal genau schauen.

Wie gesagt. Nur bei Start durch die Reg
eisbein
eisbein 06.10.2016 aktualisiert um 15:21:03 Uhr
Goto Top
Hallo!

Ich meinte eher ob im Code relative Pfade verwendet wurden.

Das vermuten kann man auch leicht durch gezielte Meldung-Ausgabe im Code eingrenzen oder mit TRY-CATCH etwas Licht ins Dunkle bringen. face-wink

Gruß
Eisbein
BoomBoomBen
BoomBoomBen 06.10.2016 aktualisiert um 23:36:54 Uhr
Goto Top
Ja, Catch und Meldungsausgabe sind mir bestens bekannt. Ich werde es noch eingrenzen.
BoomBoomBen
BoomBoomBen 06.10.2016 um 23:46:37 Uhr
Goto Top
Icon icon = Icon.ExtractAssociatedIcon("icon.ico"))  

Genau hier bleibt er hängen. Aber nur wenn die Reg das Programm startet.

Was ist am Registry start anders?
eisbein
Lösung eisbein 07.10.2016 aktualisiert um 06:49:00 Uhr
Goto Top
Guten Morgen!

Public Shared Function ExtractAssociatedIcon ( filePath As String) As Icon

Also doch ein relativer Pfad "icon.ico" face-wink
Icon icon = Icon.ExtractAssociatedIcon(Path.GetDirectoryName(Application.ExecutablePath) & "icon.ico")  
- ist da schon etwas besser.

Wenn du nun per Registry ein anderes Programm startest (also deine exe), dann stehen die Infos des Explorer nicht zur Verfügung und du musst in der exe alle Pfade absolut mit Laufwerkbuchstaben angeben.

Wenn du aber aus der Registry startest kannst du dir das Icon ohnehin sparen oder die Zeile einfach in TRY-CATCH kapseln und den Fehler verwerfen.

Gruß
Eisbein
BoomBoomBen
BoomBoomBen 07.10.2016 um 06:48:47 Uhr
Goto Top
Ich hatte es schon mit
Path.GetFullPath
erfolglos versucht.

klar verwerfe ich ihn nun, aber was bringts. Dann habe ich kein Symbol face-smile
eisbein
eisbein 07.10.2016 aktualisiert um 07:05:36 Uhr
Goto Top
Hallo!

Hab meinen vorigen Eintrag bearbeitet face-smile

Gruß
Eisbein
BoomBoomBen
BoomBoomBen 07.10.2016 um 08:22:30 Uhr
Goto Top
Vielen Dank. Klingt schlüssig.
Habe es eben mal erfolglos auf die schnelle versucht. face-smile
Werd mir das nochmal genauer anschauen.
Ich schätze mit GetFullPath hätte es doch auf laufen müssen...?
131026
Lösung 131026 07.10.2016 aktualisiert um 08:46:04 Uhr
Goto Top
Icon icon = Icon.ExtractAssociatedIcon(Path.GetDirectoryName(Application.ExecutablePath) & "icon.ico")
Da fehlt ein Backslash und das & durch ein + ersetzen, ist ja C# und nicht VB face-wink
Icon icon = Icon.ExtractAssociatedIcon(Path.GetDirectoryName(Application.ExecutablePath) + @"\icon.ico")  
BTW. warum ein Icon aus einem Icon extrahieren ??? Das ist ja schon ein Icon, das macht man normalerweise nur wenn man ein Icon aus einer exe oder DLL extrahiert. Ein Icon aus einer Datei erstellt man doch mit dem Constructor der Icon Klasse.


R.
eisbein
eisbein 07.10.2016 aktualisiert um 08:55:58 Uhr
Goto Top
Hallo!

@131026
Ja, Anpassungen sind noch nötig.

@smarthomeben

GetFullPath - Nun da ist Windows etwas eigen, je nachdem welche OS und Framework verwendet wird bzw. bei Registry-Start.
Es gibt da mehrere Möglichkeiten den Pfad der exe zu erhalten, sagt Tante Google.
Ich bin mit dieser Methode einstweilen immer ausgekommen face-wink

Gruß
Eisbein
BoomBoomBen
BoomBoomBen 07.10.2016 um 23:21:19 Uhr
Goto Top
Vielen Dank euch beiden. Es läuft!


@131026
wie sieht den die alternative ohne extrakt aus?

Theoretisch könnte ich mir doch auf diese Weise das Icon im Programmordner ersparen, wenn ich es aus der selbigen .exe wieder raushohlen kann, oder?
BoomBoomBen
BoomBoomBen 07.10.2016 um 23:58:25 Uhr
Goto Top
Ein weiteres Problem habe ich noch, dass das Icon bei Windows XP nach wie vor nicht angezeigt wird wenn dies bei Systemstart mitgestartet wird. Es wird auch kein CATCH ausgelößt. Windows 10 ist einwandfrei.

Ergänzend sei noch gesagt das es sich um eine WPF handelt. Im eigentlichen Fenster ist nochmals das Symbol nur mit icon.ico deffiniert. Ist hier auch eine absolute Pfadangabe notwendig/möglich?
eisbein
eisbein 08.10.2016 um 09:14:55 Uhr
Goto Top
Hallo!

Wie bereits gesagt ist da Windows sehr eigen was die unterschiedlichen OS betrifft.

Lass dir am besten mal den Pfad ausgeben, den du durch Path.GetDirectoryName(Application.ExecutablePath) erhältst.
Kann durchaus sein, dass da XP ein anderes oder gar kein Ergebnis liefert. Dann musst du eine andere Variante testen:
zb:
System.Windows.Forms.Application.StartupPath.
//oder//
Path.GetDirectoryName
//oder//
AppDomain.CurrentDomain.BaseDirectory
- wie gesagt, Google liefert das viele Vorschläge.

Gruß
Eisbein
131026
131026 08.10.2016 aktualisiert um 09:54:36 Uhr
Goto Top
Zitat von @BoomBoomBen:
@131026
wie sieht den die alternative ohne extrakt aus?
Icon mytrayicon = new Icon(Path.GetDirectoryName(Application.ExecutablePath) + @"\icon.ico")  
Theoretisch könnte ich mir doch auf diese Weise das Icon im Programmordner ersparen, wenn ich es aus der selbigen .exe wieder raushohlen kann, oder?
Jepp. Weise deiner Anwendung ein Icon zu und nutze bei deiner oben genutzten Methode ExtractAssociatedIcon einfach den Pfad zu deiner EXE als Parameter, dafür wurde diese Methode ja eigentlich auch erdacht face-smile
Du kannst aber auch direkt auf die Icon-Ressource deiner EXE zugreifen wenn du sie als embedded Ressource in die Anwendung einbettest.

Ist hier auch eine absolute Pfadangabe notwendig/möglich?
Nein, solche Ressourcen werden normalerweise beim kompilieren direkt in die EXE eingebettet.
BoomBoomBen
BoomBoomBen 09.10.2016 um 00:10:03 Uhr
Goto Top
Klasse. Nun läufts ohne die .ico im Programmordner und über die Registry. Das gefällt mir sehr.
Habe auch die Definition in der .xaml gelöscht. Scheint zu passen.

Habe nun alle möglichen Varianten getestet um den Pfad auszulesen. W10 und XP arbeiten hier identisch. Das Problem ist bei XP ist, dass nur bei Start über die REG das Symbol nicht angezeigt wird. Der Code läuft OHNE Catch durch und bringt keinen Fehler. Das Programm wird jedoch normal als Prozess ausgeführt und funktioniert. Nur kann ich es nicht mehr öffnen, da es "hide" gestartet wird....

Habt Ihr eine Idee wo ich noch ansetzen kann. Die Absoluten sind nun verbannt