Anzeige des Eigenschaften-Dialogs schlägt fehl

Antworten
Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Kay »

Hallo,

ich habe ein Programm erstellt, dass ausschließlich unter Windows laufen soll, daher ist die plattformunabhängig hier nicht von Bedeutung.
Ich möchte nun unter anderem den Eigenschaften-Dialog für eine beliebige Datei anzeigen lassen und habe dazu folgende Funktion implementiert:

Code: Alles auswählen

function ShowPropertiesDialog(Handle: HWND; const FileName: String): Boolean;
var
  sei: TShellExecuteInfoA;
begin
  with sei do
  begin
    cbSize := SizeOf(TShellExecuteInfoA);
    fMask := SEE_MASK_INVOKEIDLIST;
    Wnd := Handle;
    lpVerb := 'properties';
    lpFile := PChar(UTF8ToSys(FileName));
    nShow := SW_SHOWNORMAL;
  end;
  Result := ShellExecuteExA(@sei);
end;


Kompiliert wird alles einwandfrei, wenn ich das Programm starte, erhalte ich allerdings die Meldung "Falscher Parameter" - leider keine weiteren Hinweise.

Ich hoffe mir kann jemand weiterhelfen.

Vielen Dank und viele Grüße
Zuletzt geändert von Lori am Di 26. Jun 2012, 19:46, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von MAC »

sei besitzt doch garkeinen wert, muss sei nicht zuerst irgendein wert zugeordnet werden bevor du damit arbeitest.
Außerdem sollte "SizeOf(TShellExecuteInfoA);" die Größe in Byte der Klasse und nicht vom File angeben afaik

Code: Alles auswählen

Signatur := nil;

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Antrepolit »

Verwende die Unicode-Funktion ShellExecuteExW statt ShellExecuteExA. Außerdem musst du Lazarus vermutlich explizit mit Admin-Rechten starten um das auszuführen.
Grüße, Antrepolit

care only if your os is really burning

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Kay »

Hallo Antrepolit,

ich habe meine Funktion wie folgt geändert:

Code: Alles auswählen

function ShowPropertiesDialog(Handle: HWND; const FileName: String): Boolean;
var
  sei: TShellExecuteInfoW;
begin
  with sei do
  begin
    cbSize := SizeOf(TShellExecuteInfoW);
    fMask := SEE_MASK_INVOKEIDLIST;
    Wnd := Handle;
    lpVerb := 'properties';
    lpFile := PWChar(UTF8ToSys(FileName));
    nShow := SW_SHOWNORMAL;
  end;
  Result := ShellExecuteExW(@sei);
end;


Leider hat das keinen Effekt gehabt - es erscheint nachwievor die Fehlermeldung mit dem falschen Parameter.

Viele Grüße
Zuletzt geändert von Lori am Sa 30. Jun 2012, 11:06, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Antrepolit »

Wil du immer noch UTF8ToSys verwendest. Hast du mal geschaut, was nach diesem Aufruf von deinem Dateipfad übrig bleibt? Waren Umlaute drin?
Ich kenne diese Funktion (UTF8ToSys) unter Windows 7 nur als Störquelle für alles mögliche. Meine Dateioperationen führe ich direkt mit den UTF8-Dateibefehlen aus.

Ferner ist von Bedeutung, ob dein Programm das Explorer-Kontextmenü erweitert etc. Dann musst du nämlich auch 64 Bit kompilieren, wenn du ein 64 Bit-Windows verwendest.
Grüße, Antrepolit

care only if your os is really burning

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Socke »

Antrepolit hat geschrieben:Ich kenne diese Funktion (UTF8ToSys) unter Windows 7 nur als Störquelle für alles mögliche. Meine Dateioperationen führe ich direkt mit den UTF8-Dateibefehlen aus.

Die Funktionen aus FileUtil verwenden doch ihrerseits UTF8ToSys?!

Antrepolit hat geschrieben:Wil du immer noch UTF8ToSys verwendest. Hast du mal geschaut, was nach diesem Aufruf von deinem Dateipfad übrig bleibt?

Die *W-Variante der Windows-API erwartet WideChar - das heißt UTF-16 kodierte Unicode-Zeichenketten. In Free Pascal gibt es technisch gesehen zwei String-Typen dafür: UnicodeString und WideString.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Antrepolit »

Socke hat geschrieben:
Antrepolit hat geschrieben:Ich kenne diese Funktion (UTF8ToSys) unter Windows 7 nur als Störquelle für alles mögliche. Meine Dateioperationen führe ich direkt mit den UTF8-Dateibefehlen aus.

Die Funktionen aus FileUtil verwenden doch ihrerseits UTF8ToSys?!


Ach wirklich?

winfileutil.inc

Code: Alles auswählen

function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint;
begin
  Result:=FindFirst_(Path, Attr, Rslt);
end;


wobei

Code: Alles auswählen

FindFirst_       : function (const Path: string; Attr: Longint;
                       out Rslt: TSearchRec): Longint = @FindFirstWide;


und

Code: Alles auswählen

function FindFirstWide(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint;
var
  find  : TWIN32FINDDATAW;
begin
  Rslt.Name:=Path;
  Rslt.Attr:=attr;
  Rslt.ExcludeAttr:=(not Attr) and ($1e);
                 { $1e = faHidden or faSysFile or faVolumeID or faDirectory }
  { FindFirstFile is a Win32 Call }
  Rslt.FindHandle:=Windows.FindFirstFileW( PWideChar(UTF8Decode(Path)),find);
  If Rslt.FindHandle=Invalid_Handle_value then
  begin
    Result:=GetLastError;
    Exit;
  end;
  { Find file with correct attribute }
  FindWideToAnsi(find, Rslt.FindData);
  Result:=FindMatch(Rslt);
end;


Wo wird da nochmal UTF8ToSys verwendet? Das verwendet UTF8ToUnicode.
Grüße, Antrepolit

care only if your os is really burning

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Socke »

Antrepolit hat geschrieben:
Socke hat geschrieben:
Antrepolit hat geschrieben:Ich kenne diese Funktion (UTF8ToSys) unter Windows 7 nur als Störquelle für alles mögliche. Meine Dateioperationen führe ich direkt mit den UTF8-Dateibefehlen aus.

Die Funktionen aus FileUtil verwenden doch ihrerseits UTF8ToSys?!

Ach wirklich?

Dann war ich hier noch auf einem alten Stand. Auch gilt deine Aussage nicht für alle Funktionen, vergleiche beispielsweise FileAgeUTF8().
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Anzeige des Eigenschaften-Dialogs schlägt fehl

Beitrag von Bora4d »

Das funktioniert.

Code: Alles auswählen

uses
  shellapi;
 
// Thanks to Peter Below (TeamB) for this code
procedure PropertiesDialog(FileName: string);
var
  sei: TShellExecuteInfo;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.lpFile := PChar(FileName);
  sei.lpVerb := 'properties';
  sei.fMask  := SEE_MASK_INVOKEIDLIST;
  ShellExecuteExA(@sei);
end;
 
//Beispielaufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
    PropertiesDialog('C:\Programme');
end;

Antworten