AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Verknüpfung vollstädnig auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Verknüpfung vollstädnig auslesen

Ein Thema von virus82 · begonnen am 30. Jan 2009 · letzter Beitrag vom 9. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Verknüpfung vollstädnig auslesen

  Alt 30. Jan 2009, 23:18
Hallöle,

ich suche eine Methode um eine lnk.Datei komplett auszulesen. Ich habe schon die Suchfunktion genutzt und auch etwas passendes gefunden.

Verknüpfung (lnk) vollstädnig auslesen

Funktioniert auch super mit "normalen" Verknüpfungen, aber mit einigen nicht. Wenn man eine Verknüpfung mit dem Ordner Systemsteuerung oder Systemsteuerung/Software anlegt und diese dann mit der im Link beschrieben Funktion (ShellLink.GetPath) versucht einzulesen bleibt der Path leer.

z.B.:
Systemsteuerung.lnk
Software.lnk

Ich benutze WinXP SP3 und Delphi 7 Enterprise

Jemand ne Idee oder nen Anhaltspunkt?

Im Anhang die Systemsteuerung.lnk und die Software.lnk
Angehängte Dateien
Dateityp: rar lnk_172.rar (934 Bytes, 24x aufgerufen)
Marco
  Mit Zitat antworten Zitat
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

Re: Verknüpfung vollstädnig auslesen

  Alt 21. Okt 2009, 08:51
Hmm ... sieht so aus als hätte keiner ne Idee.
Marco
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Verknüpfung vollstädnig auslesen

  Alt 21. Okt 2009, 09:07
Bei solchen Links steht dort nicht der Pfad drinen, sondern nur irgendwie 'ne ID und den Pfad muß man sich dann vermutlich irgendwo aus der Registry raussuchen

keine Anhnung, ob das IShellLink automatisch macht (anscheinend ja nicht), bzw. ob man dafür noch irgendwas "einstellen" muß,

oder ob man da selber iegendwie anders rangehn muß.


[edit]
hmmm ... bei Systemsteuerung.lnk stimmt's

aber im SoftwreLink steht der Pfad drinnen


ansonsten dürfte sich bestimmt irgendwo bei MS/MSDN eine Definition dieser Datei finden lassen,
zum selberauslesen
$2B or not $2B
  Mit Zitat antworten Zitat
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

Re: Verknüpfung vollstädnig auslesen

  Alt 27. Okt 2009, 14:47
Hmm ... ok, das mit der ID hab ich mir auch schon gedacht, nur wie kann ich von solch einer Verknüpfung die ID auslesen?

Auch die Verknüpfungen von Microsoft Office 2003 im Startmenü scheinen keinen normalen Verknüpfungen zu sein.
Marco
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Verknüpfung vollstädnig auslesen

  Alt 27. Okt 2009, 15:04
Solche Verküpfungen lassen sich nur via IShellLink.GetIdList rausbekommen.

mehr dazu hier http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx und
hier MSDN-Library durchsuchenITEMIDLIST Structure

Gruß
Marco
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Verknüpfung vollstädnig auslesen

  Alt 28. Okt 2009, 09:57
OK, soweit so gut, Leider kenne ich mich damit überhaupt nicht aus. Und aus der MSDN werd ich auch nicht wirklich schlau. Wie kann man denn jetzt so ne ItemIDList in nen lesbaren String umwandeln?
Marco
  Mit Zitat antworten Zitat
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: Verknüpfung vollstädnig auslesen

  Alt 5. Nov 2009, 00:27
Kann mir jemand weiterhelfen mit dem IDItem?
Marco
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Verknüpfung vollstädnig auslesen

  Alt 5. Nov 2009, 08:52
Da kommt man ganz schön ins Schwitzen mit ItemIDList

Colin Wilson hat mal eine Unit geschrieben um erweiterte Folder Infos rauszubekommen, damit hab ich einen, auf dem Desktop liegenden Systemsteuerungslink auflösen könnnen.
die Unit gibts hier - > http://www.google.com/codesearch/p?hl=de&sa=N&cd=4&ct=rc#xZxB14YhmSA/files/d10/LowLevel100.zip|LowLevel100/Source/unitFolderUtils.pas&q=SHBindToParent%20lang:pascal

Suche nach GetFolderName und NextID. Die musst du dir zuvor noch in den implementation Teil holen. Damit kannst du die ItemIDList durchgehen und dir den namen holen.

Gruß
Marco
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: Verknüpfung vollstädnig auslesen

  Alt 5. Nov 2009, 20:28
Da hast du Recht da kann man ganz schön ins Schwitzen kommen. Schon mal Danke, schaue ich mir an.
Marco
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

Re: Verknüpfung vollstädnig auslesen

  Alt 6. Nov 2009, 10:07
So... ausgeschwitzt

hier kommt nun ein Beispiel, wie man von jeder Verknüpfung einen voll qualifizierten Namen und Pfad bekommt:

Delphi-Quellcode:
uses ComObj, ActiveX, ShlObj;

const
  IID_IShellItem: TGUID = '{43826d1e-e718-42ee-bc55-a1e261c37bfe}';

type
  {$EXTERNALSYM IShellItem}
  IShellItem = interface(IUnknown)
  ['{43826d1e-e718-42ee-bc55-a1e261c37bfe}']
    function BindToHandler(pbc: IBindCtx; const rbhid: TGUID; const riid: TIID;
      out ppvOut): HResult; stdcall;
    function GetParent(out ppsi: IShellItem): HResult; stdcall;
    function GetDisplayName(sigdnName: DWord;
      out ppszName: POleStr): HResult; stdcall;
    function GetAttributes(sfgaoMask: ULong;
      out psfgaoAttribs: ULong): HResult; stdcall;
    function Compare(psi: IShellItem; hint: DWord;
      out piOrder: Integer): HResult; stdcall;
  end;

function SHBindToParent(pidl : PItemIdList; const riid : TIID; out ppv; var ppidlLast : PItemIdList) : Hresult; stdcall; external 'shell32.dll';
function SHCreateShellItem(pidlParent: PItemIDList; psfParent: IShellFolder; pidl: PItemIDList; out ppsi: IShellItem): HResult stdcall; external 'shell32.dll';

type
  TFolderNameType = (fnNormal, fnInFolder, fnForEditing, fnForAddressBar, fnForParsing);

function GetFolderName (folder : IShellFolder; pidl : PItemIDList; tp : TFolderNameType) : WideString; overload;
var
  t : DWORD;
  str : TStrRet;
begin
  case tp of
    fnInfolder : t := SHGDN_INFOLDER;
    fnForEditing : t := SHGDN_FOREDITING;
    fnForAddressBar : t := SHGDN_FORADDRESSBAR;
    fnForPARSING : t := SHGDN_FORPARSING;
    else
      t := SHGDN_NORMAL;
  end;

  if Succeeded (folder.GetDisplayNameOf(pidl, t, str)) then
  case str.uType of
    STRRET_CSTR : result := str.cStr;
    STRRET_WSTR : begin
                      result := str.pOleStr;
                      CoTaskMemFree (str.pOleStr)
                    end;
    STRRET_OFFSET : result := PChar (pidl) + str.uOffset;
    else result := ''
  end
  else
    result := ''
end;

function ReadLnkFile(const LnkFileName: String; out Path, Arguments, WorkingDirectory, Description: String; out HotKey: Word; out ShowCmd: Integer; out IconPath: String; out IconIndex: Integer; out ItemIDList: PItemIDList): Boolean;
var
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
  FileInfo: TWin32FindData;
begin
  Result:=False;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, ShellLink)) then
  begin
    PersistFile := ShellLink as IPersistFile;
    if SUCCEEDED(PersistFile.Load(StringToOleStr(LnkFileName), STGM_READ)) then
    with ShellLink do
    begin
      SetLength(Path, MAX_PATH + 1);
      if SUCCEEDED(GetPath(PChar(Path), MAX_PATH, FileInfo, SLR_ANY_MATCH)) then
      begin
        Path := PChar(Path);
        Result := True;
        SetLength(Arguments, MAX_PATH + 1);
        GetArguments(PChar(Arguments), MAX_PATH);
        Arguments := PChar(Arguments);
        SetLength(WorkingDirectory, MAX_PATH + 1);
        GetWorkingDirectory(PChar(WorkingDirectory), MAX_PATH);
        WorkingDirectory := PChar(WorkingDirectory);
        SetLength(Description, MAX_PATH + 1);
        GetDescription(PChar(Description), MAX_PATH);
        Description := PChar(Description);
        GetHotkey(HotKey);
        GetShowCmd(ShowCmd);
        SetLength(IconPath, MAX_PATH + 1);
        GetIconLocation(PChar(IconPath), MAX_PATH, IconIndex);
        IconPath := PChar(IconPath);
        if IconPath = 'then
          IconPath := Path;
        if not Succeeded(GetIDList(ItemIDList)) then
          ItemIDList:=nil;
      end
      else
        Path := '';
    end;
  end;
end;

function GetPathFromLnkFileEx(const ALnkFileName: string; out APathEx, AParsingPath : String ): Boolean;
var
  Path, Arguments, WorkingDirectory, Description: String;
  HotKey: Word;
  ShowCmd: Integer;
  IconPath: String;
  IconIndex: Integer;
  ItemIDList: PItemIDList;

  ItemIDListLast : PItemIDList;

  ShellFolder: IShellFolder;
  ShellItem,
  ShellItem2: IShellItem;

  PName : PWideChar;
begin
   Result:=False;
   ReadLnkFile(ALnkFileName, Path, Arguments, WorkingDirectory, Description, HotKey, ShowCmd, IconPath, IconIndex, ItemIDList);

  if assigned(ItemIDList) then
    if Succeeded(SHBindToParent(ItemIDList, IID_IShellFolder, ShellFolder, ItemIDListLast)) then
    begin
      Result:=True;
      AParsingPath:=GetFolderName(ShellFolder, ItemIDListLast, fnForParsing);

      if Succeeded(SHCreateShellItem(ItemIDList, ShellFolder, ItemIDListLast, ShellItem)) then
      begin
        APathEx:='';

        while Succeeded(ShellItem.GetParent(ShellItem2)) do
        begin
          if Assigned(ShellItem2) then
          begin
            ShellItem2.GetDisplayName(0, PName);
            APathEx:='\'+WideString(PName)+APathEx;
            CoTaskMemFree(PName);
            ShellItem:=ShellItem2;
          end
          else
            Break;
        end;
      end;
    end;
end;
aufgerufen wird das ganze so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Path, //Der Pfad relativ zum Desktop (human readable)
  ParsingPath : string; //Der Pfad, wie er im System gehalten wird .. entweder Dateipfad oder eine Liste von GUIDs.
begin
  GetPathFromLnkFileEx('C:\Users\MaWarm\Desktop\abc.lnk', Path, ParsingPath );
  Caption:=Path+' - '+ParsingPath
end;
Ich hoffe, das hilft jemandem
Gruß
Marco
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz