Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ParamStr(1) unter Win7 falscher Pfad (https://www.delphipraxis.net/162469-paramstr-1-unter-win7-falscher-pfad.html)

e-gon 24. Aug 2011 09:34

ParamStr(1) unter Win7 falscher Pfad
 
Hallo zusammen,

um Dateien per Doppelklick mit meinem eigenen Programm öffnen zu können benutze ich
Delphi-Quellcode:
ExtractFileDir(ParamStr(1))
Das hat bisher auch immer gut funktioniert. Nach meinem Umstieg auf Windows 7 habe ich allerdings ein Problem, wenn die zu öffnende Datei auf dem Desktop liegt.
ExtractFileDir(ParamStr(1)) liefert dann "C:\Benutzer\USERNAME\Desktop" zurück. Aber diesen Pfad gibt es laut Windows nicht und mein Programm stürzt ab. Windows-Explorer behauptet es müsste "C:\Users\USERNAME\Desktop" heißen. Wieso liefert ParamStr dann "Benutzer"?

Natürlich könnte ich nun "Benutzer" durch "Users" ersetzen. Aber das wäre eine unsaubere Lösung! Und wer weiß welche Pfade noch falsch von ParamStr zurückgegeben werden...

Kennt jemand eine Lösung für dieses Problem?

Gruß
e-gon

s.h.a.r.k 24. Aug 2011 09:48

AW: ParamStr(1) unter Win7 falscher Pfad
 
Diesen Pfad kann man "übersetzen" lassen. Nur weiß ich gerade leider nicht mehr, wo das zu finden ist... :oops:

user0815 24. Aug 2011 09:53

AW: ParamStr(1) unter Win7 falscher Pfad
 
Müsste CSIDL_FLAG_CREATE sein.
http://www.delphipraxis.net/1082613-post8.html

siehe dazu: http://www.delphipraxis.net/1041628-post5.html

e-gon 24. Aug 2011 10:09

AW: ParamStr(1) unter Win7 falscher Pfad
 
Danke für die schnellen Antworten!

Aber wie soll mir CSIDL_FLAG_CREATE dabei helfen? ParamStr(1) liefert "C:\Benutzer\USERNAME\Desktop". Woher soll ich dann wissen, dass ich CSIDL_FLAG_CREATE abfragen muss? Auf einem anderen PC ist z. B. der Username ein anderer oder das System liegt nicht auf C: sondern D: ...

Bernhard Geyer 24. Aug 2011 10:21

AW: ParamStr(1) unter Win7 falscher Pfad
 
Zitat:

Zitat von e-gon (Beitrag 1119211)
... oder das System liegt nicht auf C: sondern D: ...

Dann zeig mal das du ein Win7-System auf D:\ bekommst. AFAIK wird hier auf jedenfall die Laufwerke so sortiert das Win7 unter C:\ liegt.

himitsu 24. Aug 2011 10:25

AW: ParamStr(1) unter Win7 falscher Pfad
 
Hmmm, mir war so, als wenn mir der Explorer (Doppelklick im Explorer oder auf Desktop) den internen nicht-lokalisierten Pfad übergibt und nicht den Lokalisierten. :gruebel:

e-gon 24. Aug 2011 10:28

AW: ParamStr(1) unter Win7 falscher Pfad
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1119217)
Zitat:

Zitat von e-gon (Beitrag 1119211)
... oder das System liegt nicht auf C: sondern D: ...

Dann zeig mal das du ein Win7-System auf D:\ bekommst. AFAIK wird hier auf jedenfall die Laufwerke so sortiert das Win7 unter C:\ liegt.

Da magst Du recht haben (ich kenne Win7 noch nicht so gut).

Worum es mir aber eigentlich geht: Da ich nicht weiß welche Pfade alles von Win7 verbogen werden ist es mir nicht möglich sämtliche Verzeichnisse auf das richtige Verzeichnis abzubilden.

Gibt es vielleicht eine Funktion wie
Delphi-Quellcode:
PathNameToRealName(ExtractFileDir(ParamStr(1)));
?

jaenicke 24. Aug 2011 11:07

AW: ParamStr(1) unter Win7 falscher Pfad
 
Das könnte eine Erklärung für Probleme sein, die ich schon einmal mitbekommen habe.

Vielleicht geht es mit GetModuleFilename korrekt?
Delphi-Quellcode:
function GetModuleFileNameWrapper: string;
var
  lpFileName: array[0..MAX_PATH] of Char;
begin
  FillChar(lpFileName, SizeOf(lpFileName), #0);
  GetModuleFileName(HInstance, lpFileName, MAX_PATH);
  Result := lpFileName;
end;

e-gon 24. Aug 2011 12:36

AW: ParamStr(1) unter Win7 falscher Pfad
 
GetModuleFilename ist gut, wenn es um das ausführende Programm geht. Ich bräuchte das aber für die zu öffnende Datei.

Um es mal deutlich zu machen: Ich habe bestimmte Dateitypen mit meinem Programm verbunden. Klickt man nun doppelt auf eine Datei diesen Typs wird automatisch mein Programm gestartet und die zu öffnende Datei per ParamStr(1) übergeben.

Den Pfad meines Programms kann ich problemlos ermitteln. Das Problem liegt dann vor, wenn die "gedoppeltklickte" Datei auf dem Desktop oder in sonst einem Verzeichnis liegt, welches von Win7 umgebogen wird.

Aber es kann ja nicht sein, dass ich der Einzige mit einem solchen Problem bin. Wie macht Ihr das, die auch so ein Programm entwickeln, das über Dateien eines bestimmten Typs geöffnet wird?

Bbommel 24. Aug 2011 12:47

AW: ParamStr(1) unter Win7 falscher Pfad
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hm. Vielleicht bist du mit deinem Problem doch einsamer als du dachtest. Ich habe es gerade mal getestet und ein Demo-Projekt erstellt, das mir den Pfad der Exe-Datei anzeigt und den Pfad der übergebenen Datei (um mal beide hier diskutierten Fälle zu erschlagen, auch wenn du ja eigentlich nur auf letzteres hinauswillst). In allen Fällen kam bei mir im Programm "c:\users\...." an.

System: Win7 Professional 64-Bit.
Delphi 2009.

Ich hänge das Mini-Programm mal einfach an. In der dritten Zeile sollte nach dem Start der Pfad der übergebenen Datei stehen. Kannst ja mal berichten, ob da bei dir auch "Benutzer" anstatt "Users" ankommt.

Phoenix 24. Aug 2011 12:48

AW: ParamStr(1) unter Win7 falscher Pfad
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1119217)
Zitat:

Zitat von e-gon (Beitrag 1119211)
... oder das System liegt nicht auf C: sondern D: ...

Dann zeig mal das du ein Win7-System auf D:\ bekommst. AFAIK wird hier auf jedenfall die Laufwerke so sortiert das Win7 unter C:\ liegt.

Das System vielleicht nicht, aber die Benutzer-Ordner kann man beliebig verschieben.

Sherlock 24. Aug 2011 13:04

AW: ParamStr(1) unter Win7 falscher Pfad
 
Vielleicht bin ich ja ein bisschen hitzegeschädigt, aber gibt nicht eigentlich Delphi-Referenz durchsuchenParamStr(0) den vollständigen Dateinamen an?

Sherlock

Bbommel 24. Aug 2011 13:10

AW: ParamStr(1) unter Win7 falscher Pfad
 
Hi Sherlock,

ich hatte es zuerst auch falsch verstanden. ParamStr(0) gibt den vollständigen Programmpfad an, aber e-gon geht es um eine von Windows automatisch als ParamStr(1) übergebene aufzurufene Datei (wenn man halt eine Datei mit "Öffnen mit" im Explorer startet).

Sherlock 24. Aug 2011 13:18

AW: ParamStr(1) unter Win7 falscher Pfad
 
Ah! OK, dann kann auch ich das geschilderte Verhalten nicht bestätigen. Denn bei mir(*) heisst auch alles korrekt "C:\users\..."

Sherlock


(*) mir= Win7 Prof 64bit SP1

e-gon 24. Aug 2011 13:19

AW: ParamStr(1) unter Win7 falscher Pfad
 
@Bbommel: Dein Mini-Programm scheint bei mir auch zu funktionieren - wenn Du statt der 3. die 2. Zeile meinst. Es steht jedenfalls zweimal C:\Users\... da.

Jetzt verstehe ich aber gar nichts mehr! Ich nutze ebenfalls Delphi 2009 auf Win7 (64 Bit)...


@Sherlock: ParamStr(0) gibt den vollständigen Programmname zurück und ab (1) bis (x) werden Parameter, die mit dem Programm aufgerufen werden, übergeben.
Bei mir steht in ParamStr(1) der vollständige Name der Datei, die doppelt angeklickt wurde.

e-gon 24. Aug 2011 13:26

AW: ParamStr(1) unter Win7 falscher Pfad
 
Ok, dank Eurer Hilfe konnte ich das Problem nun ausfindig machen. Es ist NICHT ParamStr(1) sondern eine Funktion namens ExtractLongFileName, die ich benutze um evtl. übergebene kurze Pfadnamen in lange umzuwandeln. Irgendwie scheint mein Code den Pfad von User auf Benutzer zu ändern...
Delphi-Quellcode:
    function ExtractLongFileName(const FileName: string): string;
    var FileInfo: TSHFileInfo;
    begin
      FillChar(FileInfo,SizeOf(FileInfo),#0);
      if SHGetFileInfo(PChar(FileName),0,FileInfo,Sizeof(FileInfo),SHGFI_DISPLAYNAME)<>0 then
        Result:= string(FileInfo.szDisplayName)
      else Result:= FileName;
    end;

Aber vielen Dank für Eure Hilfe!!!

e-gon 24. Aug 2011 13:31

AW: ParamStr(1) unter Win7 falscher Pfad
 
Musste Frage-Markierung noch entfernen...

jaenicke 24. Aug 2011 13:32

AW: ParamStr(1) unter Win7 falscher Pfad
 
Das ist korrekt. Der Parameter SHGFI_DISPLAYNAME, den du dort benutzt, holt explizit den dem Benutzer angezeigten Pfad statt dem realen Pfad. ;-)

// EDIT:
Was du wohl meintest ist die Funktion GetLongPathName:
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

DeddyH 24. Aug 2011 13:35

AW: ParamStr(1) unter Win7 falscher Pfad
 
Führt MSDN-Library durchsuchenGetLongPathName nicht auch zum gewünschten Ziel?

Stevie 24. Aug 2011 13:44

AW: ParamStr(1) unter Win7 falscher Pfad
 
Zitat:

Zitat von Sherlock (Beitrag 1119271)
Ah! OK, dann kann auch ich das geschilderte Verhalten nicht bestätigen. Denn bei mir(*) heisst auch alles korrekt "C:\users\..."

Sherlock


(*) mir= Win7 Prof 64bit SP1

Die Unterschiede bei euch kommen übrigens von der Sprache, in der Windows installiert ist.

jaenicke 24. Aug 2011 14:40

AW: ParamStr(1) unter Win7 falscher Pfad
 
Zitat:

Zitat von Stevie (Beitrag 1119291)
Die Unterschiede bei euch kommen übrigens von der Sprache, in der Windows installiert ist.

Welche Unterschiede? Das reale Verzeichnis heißt bei Windows Vista und 7 immer c:\users. Es wird nur dem Benutzer in seiner Sprache angezeigt.

Unter anderem genau um diesen Anzeigenamen zu bekommen gibt es die hier irrtümlich verwendete Funktion SHGetFileInfo.

Stevie 24. Aug 2011 15:41

AW: ParamStr(1) unter Win7 falscher Pfad
 
Zitat:

Zitat von jaenicke (Beitrag 1119315)
Zitat:

Zitat von Stevie (Beitrag 1119291)
Die Unterschiede bei euch kommen übrigens von der Sprache, in der Windows installiert ist.

Welche Unterschiede? Das reale Verzeichnis heißt bei Windows Vista und 7 immer c:\users. Es wird nur dem Benutzer in seiner Sprache angezeigt.

Unter anderem genau um diesen Anzeigenamen zu bekommen gibt es die hier irrtümlich verwendete Funktion SHGetFileInfo.

Die Unterschiede bei der irrtümlichen Benutzung von SHGetFileInfo. Meine Aussage bezog sich auf das: "also bei mir zeigt er das richtig an..." (daher auch der gequotete Text...) Dass die Benutzung dieser Funktion für die Ermittlung des realen Verzeichnisses falsch ist, weiß ich auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz