Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IShellLink SetPath gibt E_INVALIDARG zurück (https://www.delphipraxis.net/185567-ishelllink-setpath-gibt-e_invalidarg-zurueck.html)

Dalai 20. Jun 2015 19:21


IShellLink SetPath gibt E_INVALIDARG zurück
 
Hallo ihr :).

Da ich (mal wieder) nichts Passendes zu meinem Problem finde, bitte ich euch erneut um Hilfe.

Gegeben sei folgender Code:
Delphi-Quellcode:
uses ShlObj, ActiveX, ComObj;

const
  IID_IPersistFile: TGUID = (
    D1:$0000010B;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));

var
  FShellLink: IShellLink;
  FPersistFile: IPersistFile;

var Lfile: string;
begin
  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
  {$IFDEF UNICODE}IID_IShellLink{$ELSE}IID_IShellLinkA{$ENDIF}, FShellLink));
  OleCheck(FShellLink.QueryInterface(IID_IPersistFile, FPersistFile));
  Lfile:= 'blub.exe';
//  Lfile:= 'C:\blub.exe';
//  Lfile:= '.\blub.exe';
  OleCheck(FShellLink.SetPath(PChar(Lfile)));
end;
FShellLink und FPersistFile sind eigentlich in einer Klasse deklariert, aber darum soll es nicht gehen. Die Methode
Delphi-Quellcode:
SetPath
wirft immer E_INVALIDARG (0x80070057) raus, wenn man einen Dateinamen ohne Pfad im Funktionsparameter übergibt [ADD], und diese Datei nicht existiert (auch nicht im %PATH%) [/ADD]. Steht in dem Parameter ein Laufwerk oder ein relativer Pfad (kommentierte Zuweisungen an Lfile oben), ist alles in Ordnung. Und das obwohl es die Datei in KEINEM der o.g. Fälle gibt.

Kann sich - oder besser noch mir ;) - das jemand erklären?

MfG Dalai

ringli 20. Jun 2015 19:48

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Ich habe hier den folgenden Code gefunden:
Delphi-Quellcode:
uses ShlObj, ActiveX, ComObj;
 ...
 procedure TForm1.Button1Click(Sender: TObject) ;
 var
    IObject : IUnknown;
    ISLink : IShellLink;
    IPFile : IPersistFile;
    PIDL : PItemIDList;
    InFolder : array[0..MAX_PATH] of Char;
    TargetName : String;
    LinkName : WideString;
 begin
    TargetName := 'calc.exe';
 
    {Use TargetName:=ParamStr(0) which
    returns the path and file name of the
    executing program to create a link to your
    Application}
 
    IObject := CreateComObject(CLSID_ShellLink) ;
    ISLink := IObject as IShellLink;
    IPFile := IObject as IPersistFile;
 
    with ISLink do
    begin
      SetPath(pChar(TargetName)) ;
      //SetWorkingDirectory(pChar(ExtractFilePath(TargetName))) ;
    end;
 
    // if we want to place a link on the Desktop
    SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL) ;
    SHGetPathFromIDList(PIDL, InFolder) ;
 
    {
     or if we want a link to appear in
     some other, not-so-special, folder:
     InFolder := 'c:\SomeFolder'
    }
 
    LinkName := InFolder + '\Delphi Created Link.lnk';
    IPFile.Save(PWChar(LinkName), false) ;
 end;
Der Code scheint auch ohne Pfadangabe zu funktionieren. Zumindest mit der calc.exe... ;)

Dalai 20. Jun 2015 20:06

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Mein Code oben funktioniert auch mit calc.exe, das ist nicht das Problem. Dein Code verhält sich übrigens genauso. Einfach ein OleCheck um SetPath setzen und staunen (bei nicht existierenden Dateien) ;).

Es geht nur um nicht existierende Dateien. Klar, macht keinen Sinn, eine Verknüpfung zu einer solchen Datei zu erstellen, aber darum geht es nicht. Ich kann nicht kontrollieren, was der Nutzer für Eingaben in meiner Software macht, und auch nur sehr begrenzt abfangen/umwandeln bzw. im %PATH% suchen. Ich wüsste gern, warum das mit Angabe des Pfads funktioniert, aber ohne nicht.

MfG Dalai

Dalai 20. Jun 2015 20:56

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Ach, noch eine Info: unter Win2k arbeitet die Funktion "normal", sie setzt allerdings dem Dateinamen den Pfad zum Desktop des aktuellen Nutzers voran, so dass dann im Beispiel
Code:
C:\Dokumente und Einstellungen\Administrator\Desktop\blub.exe
rauskommt. Ab XP gibt es das E_INVALIDARG.

MfG Dalai

Dalai 27. Jun 2015 16:36

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Wenn sonst keiner eine Idee hat, werde ich die Exception fangen, diese dem Nutzer anzeigen (beides bereits der Fall) und in die FAQ/Known Issues einen Hinweis auf das "Problem" aufnehmen, der die Ursache erklärt. Gern würde ich das schöner machen, aber da ich nicht weiß, woran es genau liegt, und noch weniger, wie ich es beheben/umgehen/abfangen soll, sehe ich keine andere Möglichkeit.

MfG Dalai

redox 27. Jun 2015 17:13

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
http://www.entwickler-ecke.de/topic_...n_38600,0.html

Runterblätter bis zum 2. Beitrag von "Sprint".

Könnte helfen/umsetzbar sein ;-)

Dalai 27. Jun 2015 17:32

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Und was genau davon soll mir helfen? Oder anders gefragt: Wo ist die Verbindung zu diesem Problem hier? :gruebel:

MfG Dalai

redox 27. Jun 2015 19:09

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Zitat:

Zitat von Dalai (Beitrag 1306887)
Und was genau davon soll mir helfen? Oder anders gefragt: Wo ist die Verbindung zu diesem Problem hier? :gruebel:

MfG Dalai

Ich dachte (ohne groß drüber nachzudenken) an die Zeile mit
"SetPath wirft immer E_INVALIDARG (0x80070057) raus, wenn man einen Dateinamen ohne Pfad..." aus #1 :oops:

Aber das Result von FileExists() ist Dir schon bekannt, oder?

if FileExists() then Setpath... else Fehlermeldung().

LG

Dalai 27. Jun 2015 19:22

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Die Verwendung von FileExists würde voraussetzen, dass die Datei IMMER zuverlässig gefunden wird, egal ob 32 oder 64 Bit System, egal ob WOW64, egal ob Umgebungsvariable oder sonstwas. Könntest du das mit einem Algorithmus garantieren? Ich nicht. Man kann mit PathFindOnPath und FileSearch eine ganz brauchbare Annäherung erreichen, aber eine hundertprozentige Garantie geben die auch nicht her. Daher bin ich zu o.g. Entschluss gelangt, bevor ich zuviel "Kollateralschaden" verursache.

MfG Dalai

redox 27. Jun 2015 19:48

AW: IShellLink SetPath gibt E_INVALIDARG zurück
 
Wenn Dir fileExists() nicht genügt, dann schildere Dein Problem bitte etwas genauer und auf das Wesentliche reduziert.

Lt. #1 gehts Dir um "Dateinamen ohne Pfad"?

Was willst Du denn von dem (möglicherweise) frei erfundenen Dateinamen wissen?

Wer bekommt den Dateinamen der nicht existierenden Datei von wem?

Sorry, möglicherweise kapiere ich Dein Problem einfach nicht :oops:

=====
P.S. Willst Du den "VirtualStore" oder wie immer das Ding heißt, mit einem in Stein gemeißelten Pfad (egal ob XP, >Vista 32-bit oder >Vista 64-bit) auf der Festplatte ermitteln?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.
Seite 1 von 2  1 2      

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