Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verknüpfung von einem Ordner erstellen (https://www.delphipraxis.net/191958-verknuepfung-von-einem-ordner-erstellen.html)

Ykcim 7. Mär 2017 16:01

Verknüpfung von einem Ordner erstellen
 
Hallo Zusammen,

das Thema wurde zwar in der einen oder anderen Variante behandelt, aber ich habe trotzdem noch keine Lösung für mein Vorhaben gefunden.

Durch mein Programm wird für jede Kunden-Anfrage ein Ordner auf dem Server angelegt und in diesem Ordner auch sofort der Ordner "Angebot".
Für jede einzelne Position der Kunden-Anfrage wird in dem Anfrage-Ordner ein neuer Ordner angelegt. Bis hierhin klappt alles.

..\Anfrage\Angebot
..\Anfrage\Position1
..\Anfrage\Position2
usw.
Jetzt möchte ich aber, dass wenn die Ordner für die Positionen angelegt werden, dass dann dort drin eine Verknüpfung zum Angebotsordner erstellt wird. Und die bekomme ich nicht hin.
..\Anfrage\Angebot
..\Anfrage\Position1\Verknüpfung zu ..\Anfrage\Angebot
..\Anfrage\Position2\Verknüpfung zu ..\Anfrage\Angebot

Folgendes habe ich versucht:
Delphi-Quellcode:
function CreateLink(const AFilename, ALNKFilename, ADescription: AnsiString) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
  wsz : PWideChar;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PChar(AFilename));
    psl.SetDescription(PChar(ADescription));
    psl.SetWorkingDirectory(PChar(ExtractFilePath(AFilename)));
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      GetMem(wsz, MAX_PATH*2);
      try
        MultiByteToWideChar(CP_ACP, 0, PAnsiChar(ALNKFilename),
        -1, wsz, MAX_PATH);
        ppf.Save(wsz, true);
        result:=true;
      finally
        FreeMem(wsz, MAX_PATH*2);
      end;
    end;
  end;
end;
Delphi-Quellcode:
CreateLink('Pfad zum ..\Anfrage\Angebot', 'Pfad wo die Verknüpfung hinsoll ..\Anfrage\Position1', 'Name der Verknüpfung Angebot');

Hat jemand eine Idee für mich?

Vielen Dank
Patrick

bra 7. Mär 2017 16:43

AW: Verknüpfung von einem Ordner erstellen
 
Es scheint zwar über irgendwelche Hacks möglich zu sein, aber prinzipiell unterstützen Windows-Links keine relativen Pfadangaben.

himitsu 7. Mär 2017 16:51

AW: Verknüpfung von einem Ordner erstellen
 
Und wo ist nun dein Problem?
Passiert nichts, Fehlermeldung oder sonstwas....



Mal schnell den Code kopiert, der hier so rumgammelt.
Delphi-Quellcode:
procedure CreateLinkFile(LinkFilename, Filename, Args, Description: string);
var
  ErrorCode:   HResult;
  ShellLink:  IShellLink;
  PersistFile: IPersistFile;
begin
  ErrorCode := CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLink, ShellLink);
  if not Succeeded(ErrorCode) then
    RaiseLastOSError(ErrorCode);
  ShellLink.SetPath(PChar(Filename));
  ShellLink.SetArguments(PChar(Args));
  ShellLink.SetDescription(PChar(Description));
  ShellLink.SetWorkingDirectory(PChar(ExtractFilePath(Filename)));

  ErrorCode := ShellLink.QueryInterface(IPersistFile, PersistFile);
  if not Succeeded(ErrorCode) then
    RaiseLastOSError(ErrorCode);
  PersistFile.Save(PChar(LinkFilename), True);
end;

Ykcim 7. Mär 2017 17:33

AW: Verknüpfung von einem Ordner erstellen
 
Hallo Zusammen,

stimmt, ich habe nicht geschrieben, was mein Problem ist. Es passiert einfach nichts. Die Verknüpfung wird "kommentarlos" NICHT erstellt.

@by bra: Ich verwende auch keine relativen Pfad-Angaben, sondern hatte es nur hier zur Erklärung gemacht, damit man sieht, dass ich nicht den vollständigen Pfad kopiert hatte...
@himitsu: Ich teste Deinen Code, wenn ich nachher wieder am Platz bin...


Vielen Dank
Patrick

himitsu 7. Mär 2017 17:53

AW: Verknüpfung von einem Ordner erstellen
 
Wenn z.B. CoCreateInstance oder QueryInterface nö sagen, dann geht es nunmal kommentarlos raus und sagt auch nur "ging nicht" (False)

Ykcim 7. Mär 2017 20:12

AW: Verknüpfung von einem Ordner erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tja, leider bekomme ich es nicht hin.
Ich habe jetzt ein kleines Projekt erstellt, um das ganze zu testen. Ich hänge es hier an - vielleicht ist der Fehler dann nachvollziehbar...

Vielen Dank
Patrick

himitsu 7. Mär 2017 22:21

AW: Verknüpfung von einem Ordner erstellen
 
Der Code ist seit Jahren bei uns erfolgreich im Einsatz, allerdings füllen wir die Parameter zufällig auch richtig.
Als LinkFilename wird da das Ergebnis eines SaveDialogs reingegeben, welcher nur korrekte Dateinamen in existierenden Pfaden mit Schreibrechten raus gibt. :stipid:

Delphi-Quellcode:
CreateLinkFile('D:\Anfragen\9220\16248\Angebot.lnk', 'D:\Anfragen\9220\Angebot', '', '');


D:\Anfragen\9220\16248 ist ein Verzeichnis und keinen Dateiname?

Wenn ja, dann knallt es im PersistFile.Save mit Zugriff verweigert, was leider nicht ausgewertet wurde.
Delphi-Quellcode:
procedure CreateLinkFile(LinkFilename, Filename, Args, Description: string);
procedure Check(H: HResult);
  begin
    if not Succeeded(H) then
      RaiseLastOSError(H);
  end;
var
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
begin
  Check(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLink, ShellLink));
  Check(ShellLink.SetPath(PChar(Filename)));
  Check(ShellLink.SetArguments(PChar(Args)));
  Check(ShellLink.SetDescription(PChar(Description)));
  Check(ShellLink.SetWorkingDirectory(PChar(ExtractFilePath(Filename))));
  Check(ShellLink.QueryInterface(IPersistFile, PersistFile));
  Check(PersistFile.Save(PChar(LinkFilename), True));
end;

Ykcim 7. Mär 2017 22:35

AW: Verknüpfung von einem Ordner erstellen
 
Ich prüfe vorher ab, ob die Ordner existieren / lege sie an, wenn sie nicht existieren.
Es handelt sich tatsächlich um eine Verknüpfung zu einem Ordne und nicht zu einer Datei.

D:\Anfragen\9220\16248 ist ein Verzeichnis
D:\Anfragen\9220\Angebot ist auch ein Verzeichnis

D:\Anfragen\9220\Angebot soll in D:\Anfragen\9220\16248 als Verknüpfung erscheinen.

Vielen Dank
Patrick

himitsu 7. Mär 2017 22:40

AW: Verknüpfung von einem Ordner erstellen
 
Nicht dein Ziel ist falsch, sondern die Verknüpfungsdatei.

Das Ziel darf eine Datei oder ein Verzeichnis sein,
aber die "Datei", in welcher die Verknüpfung gespeichert wird, muß natürlich eine Datei sein.
Siehe mein vorhin gezeigtes Beispiel.


Wenn wirklich ein "Verzeichnis" mit einem anderen Verzeichnis im Dateisystem "verlinkt" verwenden soll, dann wäre das ein Bei Google suchenHardLink, bzw. ein SoftLink aka Bei Google suchenJunction.

Ykcim 8. Mär 2017 00:03

AW: Verknüpfung von einem Ordner erstellen
 
Ich :oops: ...

ich habe es *.ink statt mit *.lnk versucht.

Vielen Dank, ja, jetzt funktioniert es!!!

Gute N8
Patrick


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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