Announcement

Collapse
No announcement yet.

Links auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Links auslesen

    Ich habe folgenden Quelltext bekommen um die Windows Links auszulesen!! Es klappt auch alles. Der Compiler gibt mir nur am FreeMem eine Fehler Meldeung aus, warum???

    function GetShellLinkInfo(LinkName: string): TShellLinkInfo;<BR>
    var HRes: HResult;<BR>
    Link: IShellLink;<BR>
    PerFile: IPersistFile;<BR>
    Buffer: array[0..255] of Char;<BR>
    IntBuffer: Integer;<BR>
    WordBuffer: Word;<BR>
    Size: Integer;<BR>
    W: PChar;<BR>
    Data: TWin32FindData;<BR>

    begin<BR>
    result.Error:=True;<BR>
    Size:=(MAX_PATH*2); //MAX_PATH ist definiert in Ole2<BR>
    GetMem(W, MAX_PATH*2);<BR>
    StringToWideChar(LinkName, W, Size);<BR>
    <BR>
    HRes := CoInitialize(nil);<BR>
    HRes := CoCreateInstance(TGUID(CLSID_ShellLink), nil, CLSCTX_INPROC_SERVER,
    TGUID(IID_IShellLinkA), Link);<BR>
    if not Succeeded(HRes) then result.Error:=False;<BR>
    <BR>
    Link._AddRef; //wichtig !!!<BR>

    ReallocMem(W, Length(LinkName) +1 );<BR>
    <BR>
    HRes:=Link.QueryInterface(system.TGUID(IID_IPersis tFile), PerFile);<BR>
    if not Succeeded(HRes) then result.Error:=False;<BR>
    <BR>
    HRes := PerFile.Load(W, STGM_READ);<BR>
    if not Succeeded(HRes) then result.Error:=False;<BR>
    <BR>
    result.LinkName:=LinkName;<BR>
    <BR>
    //Beschreibung<BR>
    Link.GetDescription(@Buffer, MAX_PATH-5);<BR>
    result.Description := StrPas(Buffer);<BR>

    <BR>
    //Ziel<BR>
    Link.GetPath(@Buffer, MAX_PATH-5, Data, SLGP_UNCPRIORITY);<BR>
    result.FileName := StrPas(Buffer);<BR>

    <BR>
    //Arbeitsverzeichnis<BR>
    Link.GetWorkingDirectory(@Buffer, MAX_PATH-5);<BR>
    result.WorkingDirectory := StrPas(Buffer);<BR>
    <BR>

    //Argumente<BR>
    Link.GetArguments(@Buffer, MAX_PATH-5);<BR>
    result.Arguments := StrPas(Buffer);<BR>
    <BR>

    //FensterStatus<BR>
    Link.GetShowCmd(IntBuffer); //SW_SHOWNORMAL, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED<BR>
    result.WindowState := IntBuffer;<BR>

    <BR>
    //HotKey<BR>
    Link.GetHotKey(WordBuffer);<BR>
    result.HotKey := GetHotKey(WordBuffer);<BR>
    <BR>

    //Icon<BR>
    Link.GetIconLocation(@Buffer, MAX_PATH-5, IntBuffer);<BR>
    result.IconFileName := StrPas(Buffer);<BR>
    result.IconIndex := IntBuffer;<BR>
    <BR><BR>
    Link._Release;<BR>
    PerFile.Release;<BR>
    CoUninitialize;<BR>
    FreeMem(W, Size);<BR>
    end;<BR>
    end;<BR>

    <BR>
    Ich bin für jede Hilfe dankbar!!

    Danke

    Daniel

  • #2
    Hallo,

    warum so umständlich. Nicht immer ist es eine gute Idee, ein C/C++ Beispiel 1:1 in Delphi nachzubauen. Dank Object Pascal geht sehr vieles einfacher und besser ;-)

    <pre>
    uses ActiveX, ShlObj, ComObj;
    procedure TForm1.Button1Click(Sender: TObject);
    var
    swLinkFile : WideString;
    aShellLink : IShellLink;
    aPersistFile : IPersistFile;
    szData : array[0 .. MAX_PATH] of char;
    aFindData : TWin32FindData;
    begin
    swLinkFile := 'C:\WINNT\Profiles\Administrator\Startmenü\WinZIP. lnk';
    aShellLink := CreateComObject(CLSID_ShellLink) as IShellLink;
    aPersistFile := aShellLink as IPersistFile;
    OleCheck(aPersistFile.Load(PWideChar(swLinkFile), STGM_READ));
    Memo1.Lines.Add(swLinkFile);
    OleCheck(aShellLink.GetPath(szData, MAX_PATH, aFindData, SLGP_SHORTPATH));
    Memo1.Lines.Add(szData);
    OleCheck(aShellLink.GetArguments(szData, MAX_PATH));
    Memo1.Lines.Add(szData);
    OleCheck(aShellLink.GetDescription(szData, MAX_PATH));
    Memo1.Lines.Add(szData);
    OleCheck(aShellLink.GetWorkingDirectory(szData, MAX_PATH));
    Memo1.Lines.Add(szData);
    end;
    </pre&gt

    Comment


    • #3
      Jo, da haben sie recht. Ich werde demjenigen von dem wir die Procedure haben mal einen entsprechenden Kommentar schreiben ... Der ganze Kram funktioniert eh nicht und belegt nur unnötig Speicher. Wir wollen ja nicht wie M$ enden ...

      Danke nochmal ...

      Ciao Hage

      Comment


      • #4
        Eine Fragen geht das auch anders rum ich meine eine eigene lnk Datei zu erstellen. Da ich auf meinen Desktop automatisch einen Link zu meinen Programm haben will. Dies soll aber nicht durch ein Installationsprogramm geschehen. Das obere Beispiel zeigt ja nur wie es man Infos ausließt aber nicht hineinschreibt.

        Gruß
        Andrea

        Comment


        • #5
          An Herrn Kosch:

          Ihr obiges Beispiel scheint aber mit Links auf FTP-Ordern nicht zu funktionieren. Jedenfalls habe ich da keinen Erfolg

          Comment

          Working...
          X