![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 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