ZielPfad Eines Links (Ordner oder Datei)



  • Hi...

    Auf der Suche nach einer Möglichkeit den Ziel-Ordner einer Verknüpfung zu bekommen, bin ich nur über Beispiele gestolpert die aufzeigen, wie Verknüpfungen angelegt werden.

    Die BCB Hilfe will mir dazu auch nix sagen.

    Google und die Forum-Suche schweigen leider auch.

    Soweit ich richtig liege, sind Links Windows spezifisch. Also müsste es doch eine API-Funktion geben, die mir das Ziel-Verzeichnis zurückliefert.

    Mit Create File kann ich nicht arbeiten, da ich auch das Zielverzeichnis von Ordnern brauche (z.B. Startmenü==>Programme==>ZUBEHÖR)

    Hoffentlich versteht Ihr, worauf ich hinaus will und habt ein paar gute Tipps für mich

    ==>Eisbeer<==



  • Nein, ich verstehe nicht wirklich was Du suchst, aber wirf mal einen Blick auf die WinAPI-Funktion SHGetSpecialFolder(). Möglicherweise suchst Du das.



  • Hier steht auch drin wie man Verknüpfungen ausliest.
    http://www.bytesandmore.de/rad/cpp/snipp/sc03002.php



  • Danke für die Tipps

    SHGetSpecialFolder() liefert mir nicht die gewünschten Ergebnise.

    Das Beispiel von Braustein war interessant (Ishellink)

    ==>Eisbeer<==



  • Hi Leute !

    Seit ca. einer Woche versuch ich den Ziel-Ordner einer Ordner-Verknüpfung zu bekommen.

    Die Prozedur hab´ ich mir einfacher vorgeastellt. Auf der Suche nach einer Lösung bin ich
    über mehrere Beispiele gestolpert bzw. darauf geschubbst worden.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-99103-and-highlight-is-ishelllink.html

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-48292-and-highlight-is-ishelllink.html

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-126677-and-highlight-is-ishelllink.html

    http://www.bytesandmore.de/rad/cpp/snipp/sc03002.php

    http://support.microsoft.com/kb/130698

    Irgendwie bekomm ich es aber immer noch nicht zum Laufen.

    Ich habe mich am Beispiel von BytesAndMore orientiert, bekomme es aber nicht zum Laufen.

    Wie bekommt man die WorkingDirectory eines Ordners zurück ???

    Ich wollte am Schluss eigentlich bei ungegfähr sowas ankommen:

    IShellLink *psl;
    AnsiString Pfad = "C:\\Programme"; //Char* erwartet (Rueckgabe Puffer)
    AnsiString Text = psl->GetWorkingDirectory(Pfad.c_str(),MAX_PATH);
    

    Mein Versuch macht nix anderes, als das Programm abschmieren zu lassen.

    Ich wäre für eine einfache Hilfe dankbar !

    ==>Eisbeer<==



  • Hallo

    Ich habe mich am Beispiel von BytesAndMore orientiert, bekomme es aber nicht zum Laufen.

    Was heißt orientiert? Ich bin mir sicher das die Beschreibung und der Quellcode von bytes&more korrekt ist. Also hast du eher etwas falsch umgesetzt. Vielleicht solltest du mal das dort angebotene Beispielprojekt herunterladen und testen.

    bis bald
    akari



  • Orientiert == versucht umzusetzen ==>S.O

    TShortcutCfg sShortcut;
     if(ReadShortcut(&sShortcut, "C:\\Programme"))
       ShowMessage("Shortcut " + sShortcut.slShortcutName +
         " ist mit der Datei " + sShortcut.slDestFile + " verknüpft");
    

    liefert aber keinen Wert zurück

    ==>Eisbeer<==



  • Hallo

    Weil C:\Programme normalerweise keine Verknüpfung ist.

    bis bald
    akari



  • Okey...

    Mit dem Beispiel von BytesAndMore bin ich jetzt einen Schritt weiter gekommen.

    mit dem Aufruf von

    TShortcutCfg sShortcut;
     if(ReadShortcut(&sShortcut, "D:\\Windows Mail.lnk"))
       ShowMessage("Shortcut " + sShortcut.slShortcutName +
         " Startet im Verzeichnis  " + sShortcut.slWorkingDir);
    

    bekomme ich den Ausführungs-Pfad.

    beim Aufruf von

    TShortcutCfg sShortcut;
     if(ReadShortcut(&sShortcut, "C:\\Programme"))
       ShowMessage("Shortcut " + sShortcut.slShortcutName +
         " Startet im Verzeichnis  " + sShortcut.slWorkingDir);
    

    bekomme ich keine Pfad-Angabe.

    Wie kommt das zu Stande ?

    Unter Win Vista gibt es C:\\Programme, der Ordner hat das Attribut

    FILE_ATTRIBUTE_REPARSE_POINT
    

    Wenn ich diesen Ordner nun einlesen will, bekomme ich keine Ausgabe, da der Ordner ja auf ein anderes Ziel verweist.

    Deswegen bin ich am Zielverzeichnis der Verknüpfung interessiert.

    ==>Eisbeer<==



  • Nochmal, c:\Programme ist keine Verknüpfung. Deswegen hat es auch kein Arbeitsverzeichnis oder etwas ähnliches. Deswegen kannst du ReadShortcut darauf nicht vernünftig anwenden. Kann sein, dass das bei Vista anders ist, das beispiel bezieht sich aber nicht auf Vista.
    Was willst du eigentlich erreichen?



  • Bie Stobern in der MSDN wurde mir klar, dass diese Ordner keine Ordner sind sondern REPARSE_POINTs. (Nur NTFS)

    In der MSDN wurde die Funktion FSCTL_GET_REPARSE_POINT beschrieben. diese wird mit der Funktion DeviceIOControl benutzt.

    Laut MSDN Brauche ich den REPARSE_POINT eines Handles (Durch CreateFile)

    So ungefähr sollte das dann wohl aussehen:

    HANDLE hFile;
    
    char szOut[4];
    char *pOut;
    
    unsigned long int* lpByte;
    
    const char* MyFile = "C:\\Programme";
    
    hFile = CreateFile(MyFile, GENERIC_READ, 0, NULL,
            OPEN_EXISTING, 0, NULL);
    
    CloseHandle(hFile);
    
    DeviceIoControl(hFile, FSCTL_GET_REPARSE_POINT, NULL, NULL, pOut,
                            sizeof(szOut), lpByte, NULL);
    
    Form1->Caption = szOut;
    

    Weiter bin ich bis jetzt noch nicht gekommen. Aber dies scheint der richtige Weg zu sein.

    Ich brauche das Zielverzeichnis eines REPARSE_POINT.

    ==>Eisbeer<==



  • Dann bist ja schon auf dem richtigen Weg. Ich denke auch, dass du mit deinen Fragen im WIN-API-Forum besser aufgehoben bist.



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten