![]() |
*.Lnk Verknüpfungen funktionieren nicht.
Um zu verstehen was ich meine ist es nötig die Bilder anzusehen.
Diese Verknüpfung über ShellExecute funktioniert nicht. jemand einen Ahnung warum das so ist?
Delphi-Quellcode:
Sogar mit Ziel und Ausführen in funktioniert es nicht.
procedure StartApplication(nItem: integer);
var sShellTo, sCmdLine, sFullPath: string; begin sShellTo := gS[nItem].ShellTo; if InStr(0, sShellTo, '{') <> 0 then sShellTo := ''; sFullPath := gS[nItem].WorkDir; sCmdLine := gS[nItem].CmdLine; sCmdLine := StringReplace(sCmdLine, ';', ',', [rfReplaceAll]); if Length(sFullPath) = 0 then sFullPath := RightTrim(ExtractFilePath(sShellTo)) else SetCurrentDirectory(PWideChar(sFullPath)); ShellExecute(0, 'open', PWideChar(sShellTo), PWideChar(sCmdLine), PWideChar(sFullPath), gS[nItem].ShowCmd); end; gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Was geht nicht? Vorallem was steht in welche Variable drin? Und ich kann rein garnichts erkennen, was mit einer LNK-Datei zu tun haben soll. Wie/Wo wird da auf so eine Datei zugegriffen und wie werden die Werte dort ausglesen. Bzw. wie sieht diese Datei aus? Manchmal kann es auch nicht schaden, wenn man "Sonderfunktionen" erklärt, die nicht standardmäßig im Delphi enthalten sind. ![]() ![]() Oder den Code kommentiert, denn ich kann z.B. keinen Sinn darin erkennen, warum da TrimRight oder das SetCurrentDirectory im Code drin ist. Und warum im Himmels Willen wertet Niemand die Rückgabewerte von ShellExecute aus? Man mag es nicht glauben, aber die WinAPI sagt einem manchmal sogar, warum etwas nicht funktioniert. :roll: |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Warum Antwortest du wenn du die Bilder nicht ansehen möchtest ohne das du das tust und den Link der EXE Datei anschaust wirst du mir auch nicht helfen können. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Deine Antwort könnte in weiteren Informationen bestehen.
Und Dein Problem ist auch nicht, dass Verknüpfungen im Allgemeinen nicht funktionieren, sondern dass das Auslesen der Pfade offenbar ein Problem bereitet. Himitsu hat Dir einen wichtigen Tipp gegeben: Den Rückgabewert von ShellExecute() auszuwerten. Ansonsten versuche es mal mit einem kurzen Pfad ohne Leerzeichen. Eventuell fehlen nur die doppelten Anführungszeichen. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Er hat doch völlig Recht. Die Bildchen helfen niemand. Der Code ebenso, denn niemand kann riechen was in den Variablen steckt.
Edit: Hoppla, der rote Kasten schläft noch. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Zitat:
So einfach ist das. Die habe ich nicht angehängt weil sie schön sind sondern zu Dokumentations zwecken. Zitat:
Zitat:
gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Rückgabewerte nicht zu behandeln heißt: "Mach mal, aber wenn es nicht geht, ist es mir auch egal." Wenn es dir nicht egal ist, ob es nicht funktioniert, solltest du die Rückgabewerte auch behandeln um ggf. eine passende Fehlermeldung auszugeben. Wenn der Rückgabewert von ShellExecute wirklich sagt alles ok, bleibt nur noch mit Tools wie dem ![]() |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Was steht denn in Deinen Strings, die Du an ShellExecute übergibst?
|
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Delphi-Quellcode:
Parameter:
ShellExecuteAndWaitW(MainHandle, 'open', PWideChar(sShellTo), PWideChar(sCmdLine),
PWideChar(sFullPath), gS[nItem].ShowCmd, true); 'ShellTo, UseLabel, IconName, WorkDir, CmdLine, EnableShortcutTrueFalse' Zu Parsender String "explorer.exe, Win7(C:), @PATH@UserIcon\48x48\HD.png, @PATH@, C:\, 1" sShellTo = explorer.exe sUseLabel = Win7(C:) sUseThumb = @PATH@UserIcon\48x48\HD.png sFullPath(Workdir) = '' sCmdLine = C:\ gS[nItem].ShowCmd := SW_SHOW Als Beispiel. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Emil - wir reden aneinander vorbei. Dein Screenshot zeigt den Windows-eigenen Dialog zu den Eigenschaften des Links. Schön und gut.
Relevant ist aber doch, was in Deinen Strings steht. Und das geht aus Deinen Screenshots nicht hervor. Auch wenn Du noch so sehr insistierst. Im ersten Beitrag nutzt Du "ShellExecute", jetzt im letzten Beitrag "ShellExecuteAndWait", was eine eigene Routine ist - auch hier könnten Fehler verborgen sein. Die Notation mit "@Path@" ist mir nicht bekannt und erscheint mir suspekt. Rückgabewert von ShellExecute prüfen oder mit Werkzeugen wie dem ProzessExplorer von Microsoft mal schauen, wo Dein Programm hin will. Mehr fällt mir auch nicht ein. ich bin jetzt aber auch raus. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Zitat:
Zitat:
Zitat:
Dort steht der Komplette Pfad wie jetzt gepostet. Wenn ich den Shortcut auslese bekomme ich diesen EXE-Pfad. C:\Windows\Installer\{90160000-0011-0000-1000-0000000FF1CE}Icon.40BB677D.0A7A.4D43.9F72.5AE6F0E9 7EE2.exe logischerweise wenn jemand mein Dokument als ScreenShot angesehen hätte wäre er alleine darauf gekommen. also nun steht bei mir im Shellexecute string folgendes. ShellExecuteAndWaitW(MainHandle, 'open', 'C:\Windows\Installer\{90160000-0011-0000-1000-0000000FF1CE}Icon.40BB677D.0A7A.4D43.9F72.5AE6F0E9 7EE2.exe', '' '', SW_SHOW, true); Das Problem ist nun der Pfad C:\Windows\Installer ist versteckt. Wenn ich die Datei direkt im Ordner ausführen will kommt die Meldung "Ist keine zulässige Windows Anwendung" Wenn ich aber den ShortCut auf dem Desktop direkt doppelklicke funktioniert das. Und die Datei\Programm wird geöffnet. Zitat:
Ohne das man sich da selbst noch mit rumschlagen muss. Zitat:
Denn ich versuche auch nebenbei noch selbst auf die Lösung zu kommen. Es könnte ja sein Das diese Anwendung eine gewisse zeit benötigt um zu starten und es deshalb nicht funktioniert. Aber nach meinem Test liegt es daran definitiv nicht. Ich habe auch schon die Attribute zugewiesen um versteckte Dateien lesen zu können Aber ausführen lassen sie sich nicht.
Delphi-Quellcode:
fd.dwFileAttributes := 39; //NORMAL + READONLY + HIDDEN + SYSTEM + ARCHIVE
gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Welche Windows-Version?
32 oder 64 Bit? Ist die App 32 oder 64 Bit? |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Aber 32Bit Anwendung. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Habe gerade kein Delphi da, aber das klingt nach einem Problem mit dieser untransparenten Folderumleitung von 32 Bit Prozessen unter 64 Bit Windows.
Start über den Explorer = 64 Bit App greift auf exakt den geplanten Ordner zu. Delphi 32 Bit App bekommt möglicherweise von Windows einen anderen Ordner virtuell reingemappt. Kannst Du einfach mal ein ShellExecute reinbauen, bei dem Du nur den Ordner öffnest ohne Datei? Es sollte ein Explorer aufgehen,d er Dir genau zeigt, wo Deine Anwendung wirklich hin greift. Ich kenne das insbesondere beim system32 Verzeichnis wo eine 32 Bit App beim Zugriff auf c:\windows\system32 in Wirklichkeit unter C:\Windows\SysWOW64 landet. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Wenn ich die Anwendung nicht öffnen kann dann öffnet es mir auch nicht das Arbeitsverzeichnis dieser Anwendung. Normale 32Bit Anwendungs-Verknüpfungen laufen hatte da bisher noch kein Problem. Es ist ja nicht so das ich zu blöd dafür wäre die korrekten Parameter an ShellExecute zu übergeben aber anscheinend meinen das hier einige. ;) Destotrotz scheint es wirklich unterschiede zu geben wenn man Verknüpfungen von 64Bit Anwendungen mit einer 32Bit Anwendung öffnen will. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Ich habe mir einmal angeschaut wie das funktioniert. Der Process Monitor wurde ja schon zweimal erwähnt. Da sieht man das sehr einfach.
Wenn die Verknüpfung ausgeführt wird, wird der Pfad gar nicht angesprochen. Stattdessen läuft das ganze aus der explorer.exe über die windows.storage.dll, die CommandLineFromMsiDescriptor aus der advapi32.dll aufruft und darin dann über MsiProvideComponentFromDescriptorW aus der msi.dll und deren MsiGetComponentPathW den Pfad ermittelt. Das passiert über den angegebenen Exe-Pfad über die entsprechende Registrierung in HKCR\Installer\Features\00005109110000000100000000 F01FEC. Der Pfad zur Exe steht am Ende in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Ins taller\UserData\S-1-5-18\Components\ FDB90FF6780B32E49A9B72D2FB6D0499\00005109110000000 100000000F01FEC. Und dann wird einfach die winword.exe in dem Pfad unter Program Files aufgerufen. Sprich die angegebene Exe aus der Verknüpfung existiert gar nicht. Ich verstehe allerdings auch nicht warum du die .lnk ausliest und ausführst anstatt einfach die Verknüpfung auszuführen. Dafür ist sie ja da. Das funktioniert hier auch problemlos:
Delphi-Quellcode:
ShellExecute(Handle, 'open', 'explorer',
'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Word 2013.lnk', '', SW_SHOW); Zitat:
In diesem Fall liefert ShellExecute aber 2 zurück, was ![]() |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Aber das ist ganz einfach erklärt. Ich habe eine Anwendung geschrieben die sich da nennt OverTheTaskbar. (OTTB.exe) Das ist eine im Mac style ausgelegte Bar in der sich alle Anwendungen die man so benötigt integriert werden. Es soll Leute geben die 30 > 100 Icons auf dem Desktop liegen haben. Wenn meine Anwendung gestartet wird scannt diese alle Verknüpfungen auf dem Desktop und addiert diese zu OTTB. Der Desktop wird dann stillgelegt und die Anwendungen können dann aus der Bar heraus gestartet werden. Ich habe dann einen aufgeräumten Desktop und komme trotzdem noch an alle meine Daten. Und nein falls diese Frage auftaucht.. es wird nichts gelöscht und die Icons vom Desktop können bei bedarf über ein Menü wieder eigeschaltet werden. Jetzt hänge ich doch nochmal ein Bild an. Zitat:
Das wäre doppelt gemoppelt gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Zitat:
|
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
OB sie nun ausführbar ist, das ist eine andere Geschichte. Zitat:
Aber praktisch ist es so das ich nicht auswählen kann was der User auf den Desktop legt.. Oder? Und aussortieren kann ich da auch nichts. Wiederum aus der Bar Anwendungen aus dem Startmenu zu starten macht keinen sinn. Diese soll ja kein Ersatz für das Startmenu sein. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Also, die EXEn in C:\Windows\Installer existieren natürlich, allerdings sind das KEINE normalen EXEn der jeweiligen Anwendungen sondern sie enthalten - wie der Dateiname auch schon vermuten lässt - lediglich Ressourcen, hier Icons.
Daher auch die Meldung "Ist keine gültige Win32-Anwendung". Ich habe mit dieser Geschichte auch schon zu tun gehabt, als ich ein Plugin für Total Commander schrieb und im Zuge dessen mit Verknüpfungen (LNKs) "rumgespielt" habe. Lösung: LNK ausführen, ist viel einfacher. Es steckt in LNKs noch jede Menge Krempel, den man sonst von Hand nachbilden müsste. Grüße Dalai |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Denke mal das sollte nicht so einfach sein. Denn wie gesagt ich möchte keine Dateien vom Startmenu addieren. Und wenn jemand Word auf den Desktop abgelegt hat was dann ? Zitat:
gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
|
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Danach kannst du auch den Installer Ordner unter Windows finden. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Eventuell liege ich ja vollkommen daneben, aber ich würde mir vom Desktop einfach alle Links sammeln (oder was ich sonst so auswählen möchte) und die dann in der Form starten:
Delphi-Quellcode:
ShellExecuteAndWaitW(MainHandle, 'open', PWideChar(sPfadUndNameDerLinkdatei), '', '', gS[nItem].ShowCmd, true);
Windows kann dann mit seiner "eingebauten Logik" für den entsprechenden Programmstart (unter Auswertung aller in der Linkdatei enthaltenen Konfigurationen) sorgen. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Für die Ausführung ist die Datei also definitiv nicht nötig. Das Icon könnte im Cache liegen. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Denn es gibt unter umständen mehrere Benutzer am Computer da kann man nicht sicher sein ob man einen zugriff auf den Desktop Order des jeweiligen Users bekommt. Auf der anderen Seite gibt es ja auch so etwas. Zitat:
Dann verzichte ich lieber auf Office. ;) Aber wenn dann wäre dieser weg den Desktop Ordner zu durchsuchen der richtige. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Es sei denn du hast Office 2016 installiert. So wie ich das aber sehe sind fast alle 64Bit installierten Anwendungen dort vertreten. Darauf habe ich dann auch keinen zugriff. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Zitat:
Zitat:
Grüße Dalai |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Zitat:
Es gibt *.URL, *.lnk und User definierte Ausführbare Icons auf der Bar. Für euch außenstehende ist das kein Problem... ja mach mal eben. ;) Aber ihr kennt den Aufwand nicht der betrieben werden muss damit das nachher auch alles seine Richtigkeit hat. Aber gut habe eine Lösung gefunden. Ich prüfe ob ein Link existiert. If DoLnk >> dann übergebe ich normalerweise den Target Pfad also den wo sich die Exe befindet.
Delphi-Quellcode:
den ändere ich jetzt um auf
if DoLnk then
begin gS[nCount].ShellTo := Lowercase(sTarget); // <<<< Target = 'C:\Windows\Installer\{90160000-0011-0000-1000-0000000FF1CE}Icon.40BB677D.0A7A.4D43.9F72.5AE6F0E9 7EE2.exe' gS[nCount].WorkDir := PWideChar(pLnk.WorkDir); gS[nCount].CmdLine := PWideChar(pLnk.Arguments); gS[nCount].ShowCmd := integer(pLnk.ShowCmd); gS[nCount].CtrlName := sTxt; gS[nCount].CtrlIndex := nCount; end; gS[nCount].UseLabel := sTxt;
Delphi-Quellcode:
gS[nCount].ShellTo := Lowercase(sFullName); // <<<< 'C:\Users\Gast\Desktop\Word 2016.lnk'
damit sollte das Problem erstmal erledigt sein. (Muss das aber noch überwachen). gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
OK jetzt geht's hab euch noch ein paar Herzen hinzugemacht. LOL
Die Herzen sind Verknüpfungen der Rest ist vordefiniert in meiner Config Datei. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Zitat:
Grüße Dalai |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Ach egal ;)
Es funktioniert ja jetzt mit eurer Idee. Danke! Hoffe die Herzchen sind dank genug... LOL (wenn ihr sie dann anschaut.) Zitat:
Ich habe die lade Routine der Icons jetzt nicht verändert diese werden immer noch aus dem Target Pfad gelesen (direkt aus der EXE) Sieht zwar blöd aus da manche hier das Package Icon abgelegt haben aber was soll's. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Im Grunde genommen muss man das als Platzhalter verstehen klar hätte ich auch "Hänschen" benennen können. ;) Im Code prüfe ich ob der Anwendungspfad der gleiche ist wie der Arbeitspfad wenn das zutrifft wird der Arbeitspfad durch diese Variable ersetzt um nicht ellenlange Strings in die Konfigurationsdatei zu schreiben. bsp: @PATH@UserIcon\48x48\Prompt.png := Der Anwendungspfad + der Ordner wo sich die Icons befinden. Ich denke auf diese Art einen Platzhalter zu definieren ist durchaus angebracht. Oder der Anwendungspfad zu meiner Anwendung. Jetzt! Zitat:
Zitat:
Aber gut sei's drum. -------------------- Mit den Verknüpfungen bin ich noch nicht durch. Wenn ich jetzt direkt die *.lnk Dateien als Anwendungspfad angebe gibt es Probleme wenn der User diese vom Desktop entfernt. Es gibt dann auch noch das Problem das die User definierten Icons dann für *.lnk Dateien unnötig sind zudem wird die Konfiguration dann unbrauchbar. Eventuell muss ich den String parsen und nach dem Namen Icon scannen Und nur dann wenn dieser existiert den Anwendungspfad austauschen mit dem vom Desktop wo die Verknüpfung abgelegt ist. C:\Windows\Installer\{90160000-0011-0000-1000-0000000FF1CE}Icon.40BB677D.0A7A.4D43.9F72.5AE6F0E9 7EE2.exe Ich denke das sollte auf allen Windows verschiedener Sprachen gleich sein. Auf "C:\Windows\Installer\" hin zu prüfen dürfte fehlschlagen. PS: Habe jetzt nochmal alles umgebaut es werden jetzt nur noch positive Array Indexes verwendet. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Wenn du die .lnk Dateien ausliest und die Daten irgendwo speicherst, machst du ja im Grunde auch nichts anderes. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Er wird ja einen Grund haben warum er sie löscht. Es ist ja nicht so das die Anwendung dadurch abstürzt. Nur die Anzeige der Icons auf der Bar sind dadurch beeinträchtigt. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Es macht denke ich eher Sinn den Eintrag schlicht zu entfernen, denn ich habe das so verstanden, dass das ein Abbild der Desktop Icons sein soll, oder? // EDIT: Viel schöner wäre da allerdings ein Tool, dass die auch direkt ins Startmenü einklappern kann. Wenn ich irgendwo einen Rechner einrichte, dauert es immer recht lange die alle anzuklicken und da hinein zu befördern... Aber ich glaube das ist (aus gutem Grund...) nicht vorgesehen. |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Ich möchte aber eigentlich nur dafür sorgen das der Desktop aufgeräumt wird. Ohne Daten zu verändern, verschieben oder sonstiges. Ich möchte also nicht so tief in das System eingreifen, so das ich nachher besondere Rechte für das Programm benötige. Es ist am ende nur eine Schnellstart Leiste die man seinen Ansprüchen entsprechend anpassen kann. gruss |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Und noch ein Hinweis zu lnk-Dateien:
Sie speichern noch MEHR als nur das Icon und die Pfade! Somit solltest du immer ShellExcec mit der Lnk-Datei machen. In der Lnk-Datei stehen weitere Konfigurationen wie: - Kompatibilitätsmodus - Fenstergröße/Schriftart.. (bei z.B. Batchprogrammen bzw. Dos-Programmen). - Sogar Zugriffsrechte.. - ... Diese würdest du komplett verlieren, wenn du nur die Anwendungsdatei berücksichtigst zum Aufruf verwendest. Und wenn die lnk-Datei vom User entfernt wurde, dann sollte diese auch bei dir entfernt werden. Schließlich will das der User so... ;) |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Man kann nicht pauschal sagen man sollte immer... sicher das ist der einfachste weg aber nicht immer der sinnvollste. Abhängig von dem was sonst noch an dem Programm dranhängt. Ich hoffe das kommt jetzt nicht wieder überheblich oder falsch rüber. Zitat:
Also wenn er sie dann gelöscht hat werden sie auch nicht mehr addiert. Wurde sie jedoch gespeichert dann ist immer noch ein Icon in der Bar das dann aber Leer ist. Es liegt dann an ihm selbst das in der Konfigurationsdatei zu beheben. Zitat:
Also was ich so brauche.
Delphi-Quellcode:
gruss
TSprite = packed Record
CtrlName: WideString; CtrlIndex: Integer; Left: Single; Top: Single; Width: Integer; Height: Integer; Scale: Single; Opacity: Byte; ShellTo: string; IconPath: WideString; WorkDir: WideString; UseLabel: string; CmdLine: WideString; ShowCmd: LongInt; h_Bitmap: HBitmap; Visible: Bool; End; |
AW: *.Lnk Verknüpfungen funktionieren nicht.
Zitat:
Mal ehrlich: Anwendungen, die man sehr häufig benutzt (mehr als 10-15 Stück werden das bestimmt nicht sein), kommen in die Windows-Standard-Taskbar. Der Rest ist über Windows-Taste und Eingabe des Programmnamens sehr leicht zu finden bzw. zu starten. Daher erschließt sich mir der Sinn Deines Taskbar-Aufsatzes nicht wirklich. :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz