Wie kann ich aus einer bestehenden Verknüpfung den Zielpfad auslesen?

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Unwesen.

    Wie kann ich aus einer bestehenden Verknüpfung den Zielpfad auslesen?

    Hi. Ich hab mit meiner bisherigen Suche iwie nur immer Seiten zum Thema neue Verküpfung erstellen usw. finden können und sofern diese eine Antwort auf meine Frage beinhalten, verstehe ich sie offenbar nicht.

    Jedenfalls ist meine Absicht, zum Beispiel eine Verknüpfung von Desktop in mein Programm zu ziehen und den Pfad zu ihrem Ziel, sowie den Pfad, aus der sie ihr Icon bezieht zu ermitteln.

    Ich habe mir nun Spaßeshalber mal einen *.lnk in Notpad geladen, um mir den Aufbau anzusehen, das Ergebnis sah aber leider etwas wirr aus.. Wie kann ich also die enthaltenen Daten, in Benutzbare Informationen, die ich in meinem Programm weiterverwenden kann, umwandeln?
    Das ist Unicode.
    Der Text sieht so aus:
    Müll "O", "S", <NUL>, HierStehtDeinPfad, <NUL>, Müll

    <NUL> ist ein Steuerzeichen des Codes 0

    Also: in Unitext einlesen, "OS" suchen, <NUL> überspringen, den Text bis zum nächsten <NUL> in Deinen String übertragen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    edenfalls ist meine Absicht, zum Beispiel eine Verknüpfung von Desktop in mein Programm zu ziehen und den Pfad zu ihrem Ziel, sowie den Pfad, aus der sie ihr Icon bezieht zu ermitteln.
    Drag&Drop:
    [VB 2010] Drag&Drop von Dateien (aus Explorer/Desktop) in Form (muß du noch anpassen)
    Dateiverknüpfung auslesen:
    msdn.microsoft.com/de-de/library/bb979129.aspx (muß noch umschreiben)
    (vieleicht postet jemand NET Beispiel)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SystemUnknow“ ()

    RodFromGermany schrieb:

    Das ist Unicode.

    Der Text sieht so aus:

    Müll "O", "S", <NUL>, HierStehtDeinPfad, <NUL>, Müll



    <NUL> ist ein Steuerzeichen des Codes 0



    Also: in Unitext einlesen, "OS" suchen, <NUL> überspringen, den
    Text bis zum nächsten <NUL> in Deinen String übertragen.
    Hmja.. Klang jetzt eigentlich recht einfach, aber ich weiß offenbar doch nicht, wie ich dabei vorzugehen habe. -.-
    So hat das bei mir funktioniert:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim path As String = "C:\Temp\__Test.lnk"
    3. Dim GeladenerLINK As String
    4. GeladenerLINK = Convert.ToString(My.Computer.FileSystem.ReadAllText(path))
    5. GeladenerLINK = GeladenerLINK.Substring(GeladenerLINK.IndexOf("OS") + 3)
    6. GeladenerLINK = GeladenerLINK.Substring(0, GeladenerLINK.ToLower.IndexOf(".exe") + 4)
    7. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ähm.. Das hast du jetzt aber net wirklich überprüft, oder?
    Da bleibt der String am Schluß leer.
    Bzw. Leer trifft es net ganz, zumindest ist dann nicht der Pfad separiert.
    ?(
    Bei meinen eigenen Versuchen fand ich vor dem Pfadnamen übrigens nie die von dir beschriebene Zeichenfolge.

    Was mir aber aufgefallen ist, als ich verschiedene Links mal mit einem Hex Editor geöffnet habe:
    Vor der Pfadangabe steht bei den meisten folgende Zeichenfolge (Hex):
    00 0C 25 29 22 10 25 20 00 00 00

    Wenn ich wüsste, wie ich nun direkt anch diesen Hexcodes suchen könnte, käme ich eventuell weiter.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Unwesen“ ()

    RodFromGermany schrieb:

    So hat das bei mir funktioniert:

    Das hab ich genau so getestet.
    Windows7, 64 Bit, Studio 2008

    Wenn Du die Zeichen so identifizierst, kannst Du doch auch locker den String extrahieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm, Win7 x64 hab ich auch. VS 2010

    Das ist der Code:

    VB.NET-Quellcode

    1. Dim Dateipfad As String = Application.StartupPath & "\Test1.lnk"
    2. Dim GeladenerLINK As String
    3. GeladenerLINK = Convert.ToString(My.Computer.FileSystem.ReadAllText(Dateipfad))
    4. For Each item As String In GeladenerLINK '(Kontrolle)
    5. RichTextBox1.Text += item 'Gebe Inhalt in Textbox aus
    6. Next
    7. GeladenerLINK = GeladenerLINK.Substring(GeladenerLINK.IndexOf("OS") + 3)
    8. GeladenerLINK = GeladenerLINK.Substring(0, GeladenerLINK.ToLower.IndexOf(".exe") + 4)
    9. Label1.Text = GeladenerLINK

    Wenn ich einen Haltepunkt setze, ist auch nach abarbeiten der Anweisungen in GeladenerLINK (auf den ersten Blick) der gleiche Inhalt wie direkt nach dem Einlesen des Links.
    In Label1.Textl erscheint dann gar nichts.

    Meine Test*.lnk sind dabei eine Verknüpfung zu was eigenem, eine zu Audacity, eine zu Bittorrent.

    // Hm, ich kann die Zeichen aber doch nur in nem Hexeditor identifizieren, wie kann ich denn intern nach Hexcodes suchen? Ich habe ja versucht, das als Ascii String zu definieren, aber VS akzeptiert diese Zeichenfolge net so recht. Wenn ich die zwischen Anführungszeichen schreibe, bleibt im Prinzip nur ein % und ein Leerzeichen übrig. :(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Unwesen“ ()

    Dann musst Du natürlich meine Extension ".exe" durch Deine Extension ersetzen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oder mit Windows Scripting Host

    Beispiel: Benötigt den Verweis auf COM-Object "Windows Scripting Host Object Model"

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. For Each fi As String In IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "*.lnk")
    3. Me.ReadLnk(fi)
    4. Next
    5. End Sub
    6. Private Sub ReadLnk(ByVal filename As String)
    7. Dim shortCut As IWshRuntimeLibrary.IWshShortcut
    8. Debug.WriteLine("")
    9. Debug.WriteLine("Lnk-Datei: " & filename)
    10. shortCut = CType((New IWshRuntimeLibrary.WshShell).CreateShortcut(filename), IWshRuntimeLibrary.IWshShortcut)
    11. Debug.WriteLine("Auszuführende Datei: " & shortCut.TargetPath)
    12. Debug.WriteLine("Arbeitsverzeichnis: " & shortCut.WorkingDirectory)
    13. Debug.WriteLine("Beschreibung: " & shortCut.Description)
    14. Debug.WriteLine("Start-Parameter: " & shortCut.Arguments)
    15. Debug.WriteLine("HotKey: " & shortCut.Hotkey)
    16. Debug.WriteLine("Icon: " & shortCut.IconLocation)
    17. End Sub
    Eine Datei mit der Endung *.lnk ist ein Verweis auf z.B. eine *.exe oder *.txt-Datei.
    Die *.lnk-Datei wird ausgelesen und ihr Inhalt untersucht.
    Dieser Inhalt kann z.B. sein:
    "C:\Temp\MyExe.exe"
    oder
    "C:\Temp\MyText.txt"
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    Eine Datei mit der Endung *.lnk ist ein Verweis auf z.B. eine *.exe oder *.txt-Datei.
    Die *.lnk-Datei wird ausgelesen und ihr Inhalt untersucht.
    Dieser Inhalt kann z.B. sein:
    "C:\Temp\MyExe.exe"
    oder
    "C:\Temp\MyText.txt"
    Äh, ja.. Das ist mir schon klar.

    Quellcode

    1. L�F� �`�~Bo��`�~Bo�⟨���lj�P�O� �:i��+00�/C:\�1u=�3PROGRA~2|��:�u=�3*RProgram Files (x86)@shell32.dll,-21817�1S=\ Audacity 1.3 Beta (Unicode)d�S=Y S=\ *m
    2. Audacity 1.3 Beta (Unicode)*b2lj}<$� audacity.exeF�S=Y S=Y *maudacity.exe�X�<̞s"+n+(?_?)+n+ %)"%(�%_�%)%)"% C:\Program Files (x86)\Audacity 1.3 Beta (Unicode)\audacity.exeE..\..\..\Program Files (x86)\Audacity 1.3 Beta (Unicode)\audacity.exe2C:\Program Files (x86)\Audacity 1.3 Beta (Unicode)�*�
    3. ��@Z|���K�J������� ��1SPS0�%��G��`���-
    4. audacity.exe%
    5. Anwendung@�Bo�lj@⟨����1SPS�XF�L8C���&�m�q/S-1-5-21-3997610898-2462487145-3918780418-1001�1SPS�0��C�G����sf"ud1Audacity 1.3 Beta (Unicode) (C:\Programme (x86))�1SPS�jc(=�����O�Б@C:\Program Files (x86)\Audacity 1.3 Beta (Unicode)\audacity.exe`�Xunwesen-7Ɉ�ә�@����G�[NUw�����PV�Ȉ�ә�@����G�[NUw�����PV�


    Und das obige ist der Inhalt von GeladenerLINK direkt nach dem Einlesen.
    Verstehe ich nur net, worauf du hinauswillst?

    Dein Code soll also die Zeichenfolge "OS" finden, drei stellen überspringen, das folgende als Pfadname bis zu .exe herausfiltern. Das Problem ist aber offenbar, das in keinem meiner Links "OS" vorzukommen scheint.

    ".exe" hingegen ist zu finden. Das Problem ist eben, das ".exe" mehrfach vorkommt und ich einen eindeutigen Pfadanfang brauche, damit ab da das erste auftreten von ".exe" das Ende des Suchstrings kennzeichnet.

    Wie gesagt, die Hexcodes "00 0C 25 29 22 10 25 20 00 00 00" sind zumindest in 4 von 5 Fällen jeweils vor dem Pfadnamen zu finden gewesen, aber mein Versuch diese Zeichenfolge ohne einen Hexeditor zu finden, war bislang auch ergebnislos.

    VB.NET-Quellcode

    1. GeladenerLINK = GeladenerLINK.Substring(GeladenerLINK.IndexOf(Chr(&H0) & Chr(&HC) & Chr(&H25) & Chr(&H29) & Chr(&H22)))


    <- Hätte dann eigentlich etwas finden sollen, wenn es denn auf diese Art funktionieren würde.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Unwesen“ ()

    Merkwürden, dass die Inhalte so verschieden aussehen. :(
    Leider kommt der Unicode-Text in Deinem Post hier nicht so an, ich kann das nicht so nachverfolgen.
    Da musst Du nun so lange probieren, bis es stimmt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    xtts02 schrieb:

    Oder mit Windows Scripting Host

    Beispiel: Benötigt den Verweis auf COM-Object "Windows Scripting Host Object Model"

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. For Each fi As String In IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "*.lnk")
    3. Me.ReadLnk(fi)
    4. Next
    5. End Sub
    6. Private Sub ReadLnk(ByVal filename As String)
    7. Dim shortCut As IWshRuntimeLibrary.IWshShortcut
    8. Debug.WriteLine("")
    9. Debug.WriteLine("Lnk-Datei: " & filename)
    10. shortCut = CType((New IWshRuntimeLibrary.WshShell).CreateShortcut(filename), IWshRuntimeLibrary.IWshShortcut)
    11. Debug.WriteLine("Auszuführende Datei: " & shortCut.TargetPath)
    12. Debug.WriteLine("Arbeitsverzeichnis: " & shortCut.WorkingDirectory)
    13. Debug.WriteLine("Beschreibung: " & shortCut.Description)
    14. Debug.WriteLine("Start-Parameter: " & shortCut.Arguments)
    15. Debug.WriteLine("HotKey: " & shortCut.Hotkey)
    16. Debug.WriteLine("Icon: " & shortCut.IconLocation)
    17. End Sub

    OK, ich habe jetzt den Code von xtts02 probiert, das scheint meine Probleme zu lösen. Danke dir!



    RodFromGermany danke ich auch, zwar brachte das jetzt keine direkte
    Lösung, dafür war es trotzdem nett, mal an einem spezifischen Beispiel
    die Benutzung von Substring gezeigt zu bekommen. (Bin da bisher etwas
    umständlicher mit Mid, instr, Split und so weiter am werkeln^^)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Unwesen“ ()