AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetSpecialFolder

Ein Thema von Mike_on_Tour · begonnen am 27. Mär 2008 · letzter Beitrag vom 21. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Mike_on_Tour

Registriert seit: 16. Aug 2007
195 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

GetSpecialFolder

  Alt 27. Mär 2008, 11:37
Hallo,

ich möchte in einem Programm den Systempfad für "Dokumente für alle Benutzer ermitteln". Das mache ich mit der Funktion "GetSpecialFolder" und CSIDL_COMMON_DOCUMENTS als Parameter.

Delphi-Quellcode:
function GetSpecialFolder (CSIDL: Integer) : String;
var
  ItemIDList: PItemIDList;
  sFolderPath : String;
  iSystemFolder : Integer;
  pMalloc : IMalloc;
begin
  pMalloc := nil;
  sFolderPath := '';
  SHGetMalloc (pMalloc);
  if (pMalloc = nil)
    then begin
      Exit;
    end;
  try
    iSystemFolder := CSIDL;
    if (SUCCEEDED (SHGetSpecialFolderLocation (0, iSystemFolder, ItemIDList)))
      then begin
        SetLength (sFolderPath, MAX_PATH);
        if (SHGetPathFromIDList(ItemIDList, PChar(sFolderPath)))
          then begin
            SetLength (sFolderPath, Length(PChar(sFolderPath)));
          end;
      end;
  finally
    Result := sFolderPath;
    pMalloc.Free(ItemIDList);
  end;
end;
Prinzipiell funktioniert das auch ganz gut. Ich habe aber jetzt den Fall, daß das Ergebnis der Funktion ein leerer String ist. Meine Vermutung ist, daß "pMalloc = nil" ist und die Funktion beendet wird. Aber warum ?

Was könnte die Ursache sein und wie kann ich darauf reagieren ?

mfG

Mike
Programmieren ist wie das Wandeln auf dem schmalen Pfad zwischen Wahnsinn und Intelligenz.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: GetSpecialFolder

  Alt 27. Mär 2008, 11:45
Da gibt es doch eine fertige API-Funktion dafür.
Der kannst Du mitgeben, welchen SpecialFolder Du suchst.
Leider hab ich grad den Namen vergessen und das Delphi momentan nicht gestartet.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#3

Re: GetSpecialFolder

  Alt 27. Mär 2008, 11:51
Ich hatte mal ein relativ ähnliches Problem. Allerdings konnte ich nie wirklich herausfinden wieso es zu dem Problem kommt. Ich hab stattdessen begonnen die entsprechenden APIs zu meiden und mir den Wert einfach selbst aus der Registry gefischt:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  registry, windows;

//FIXME: Diese Funktion ist ANSI only, bedeutet UNICODE Pfade werden nicht
// korrekt zurückgeliefert
function GetRegistryPath(valuename : string) : string;
begin
  result := '';
  with TRegistry.Create do
    begin
      RootKey := HKEY_LOCAL_MACHINE;
      OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'+
                      '\Shell Folders');
      if ValueExists(valuename) then
        result := ReadString(valuename);
      CloseKey;
      Free;
    end;
end;

begin
  writeln(GetRegistryPath('Common Documents'));
  readln;
end.
Solltest Du also keine Lösung für Dein Problem finden, hast Du hier wenigstens eine Alternative .
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: GetSpecialFolder

  Alt 27. Mär 2008, 11:59
Zitat von wido:
Ich hab stattdessen begonnen die entsprechenden APIs zu meiden und mir den Wert einfach selbst aus der Registry gefischt:
Und genau das soll man nicht machen. Denn Microsoft behält sich vor den Ort und Namen in er Registry zu ändern. Deswegen gibt es die entsprechenden Funktionen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: GetSpecialFolder

  Alt 27. Mär 2008, 11:59
Zitat von wido:
Ich hatte mal ein relativ ähnliches Problem. Allerdings konnte ich nie wirklich herausfinden wieso es zu dem Problem kommt. Ich hab stattdessen begonnen die entsprechenden APIs zu meiden und mir den Wert einfach selbst aus der Registry gefischt:
Dann solltest du dir dies mal durchlesen: The long and sad story of the Shell Folders key


Zitat von Mike_on_Tour:
Meine Vermutung ist, daß "pMalloc = nil" ist und die Funktion beendet wird. Aber warum ?
Dann debug deinen Code doch mal, dann weißt du es.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: GetSpecialFolder

  Alt 27. Mär 2008, 12:00
mit dem RootKey HKEY_LOCAL_MACHINE findest Du aber nur die Sachen für AllUsers.

Wenn Du die Sachen des aktuellen USers haben möchtest, musst Du HKey_CURRENT_USER verwenden.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Mike_on_Tour

Registriert seit: 16. Aug 2007
195 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: GetSpecialFolder

  Alt 27. Mär 2008, 12:01
Zitat von wido:
Ich hatte mal ein relativ ähnliches Problem. Allerdings konnte ich nie wirklich herausfinden wieso es zu dem Problem kommt. Ich hab stattdessen begonnen die entsprechenden APIs zu meiden und mir den Wert einfach selbst aus der Registry gefischt: ... Solltest Du also keine Lösung für Dein Problem finden, hast Du hier wenigstens eine Alternative .
Danke für den Beistand und die alternative Lösung. Ich werde mir das mal anschauen.

Zitat von wido:
Da gibt es doch eine fertige API-Funktion dafür.
Kann es sein, daß ich die schon verwende ?

Mike
Programmieren ist wie das Wandeln auf dem schmalen Pfad zwischen Wahnsinn und Intelligenz.
  Mit Zitat antworten Zitat
Mike_on_Tour

Registriert seit: 16. Aug 2007
195 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: GetSpecialFolder

  Alt 27. Mär 2008, 12:05
Zitat von Luckie:
Dann debug deinen Code doch mal, dann weißt du es.
Das mache ich ja schon. Das Dumme ist nur, das es bei mir funktioniert. Oh, ich habe vergessen anzugeben, daß es auf einem Computer in 300 km Entfernung eben nicht geht.
Programmieren ist wie das Wandeln auf dem schmalen Pfad zwischen Wahnsinn und Intelligenz.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: GetSpecialFolder

  Alt 27. Mär 2008, 12:07
Hilfe lesen:
Zitat:
With Microsoft Windows 2000, this function is superseded by MSDN-Library durchsuchenSHGetFolderLocation.
Zitat von Mike_on_Tour:
Das mache ich ja schon. Das Dumme ist nur, das es bei mir funktioniert. Oh, ich habe vergessen anzugeben, daß es auf einem Computer in 300 km Entfernung eben nicht geht.
Dann ergänz deine if-abfragen um die entsprechenden else-Zweige und gibt dort eine Fehlermeldung aus. Ein Aufruf von MSDN-Library durchsuchenGetLastError könnte auch nicht schaden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#10

Re: GetSpecialFolder

  Alt 27. Mär 2008, 12:42
Zitat von Luckie:
Dann solltest du dir dies mal durchlesen: The long and sad story of the Shell Folders key
Ich kenn den Blog Post bereits. Ändert nichts an folgenden Punkten:

1. SHGetSpecialFolderLocation ist von der Benutzung her extrem umständlich.
2. SHGetSpecialFolderLocation neigt dazu aus heiterem Himmel fehl zu schlagen.
3. SHGetSpecialFolderLocation hat einen gigantischen Overhead.

Die Limitierung, daß die Registry Keys erst nach der ersten Verwendung von SHGetSpecialFolderLocation erstellt werden, ist für die Werte, die hier abgefragt werden irrelevant, da sie auch bei einem frisch installiertem Windows bereits existieren.

Allerdings bin ich wahrscheinlich einfach nur zu ungebildet und pragmatisch veranlagt ...
  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 16:24 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