Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Probleme mit GetShellFolder!


SunnyDream - Mo 05.06.06 01:24
Titel: Probleme mit GetShellFolder!
Huhu liebe Community!
Nachdem in meinem Thread Hier [http://www.delphi-forum.de/viewtopic.php?t=60985&highlight=] einige neue Fragen zum Thema GEtShellFolder aufgekommen sind, dachte ich, ich mache einen neuen Thread dazu auf.
(Der Übersicht halber)

Mein Problem ist folgendes: Ich will den Temp Ordner des Nutzers feststellen, und verwende dazu die GetShellFolder Funktion:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
function GetShellFolder(CSIDL: integer): string;
var   
  pidl              : PItemIdList;   
  FolderPath        : string;   
  SystemFolder      : Integer;   
  Malloc            : IMalloc;   
begin   
  Malloc := nil;   
  FolderPath := '';   
  SHGetMalloc(Malloc);   
  if Malloc = nil then   
  begin   
    Result := FolderPath;   
    Exit;   
  end;   
  try   
    SystemFolder := CSIDL;   
    if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then   
    begin   
      SetLength(FolderPath, max_path);   
      if SHGetPathFromIDList(pidl, PChar(FolderPath)) then   
      begin   
        SetLength(FolderPath, length(PChar(FolderPath)));   
      end;   
    end;   
    Result := FolderPath;   
  finally   
    Malloc.Free(pidl);   
  end;   
end;

// Aufruf:
const CSIDL_APPDATA = $001a;
//...
MeinSavePath := GetShellFolder(CSIDL_APPDATA);


In die Uses habe ich sowohl ShlObj als auch ShellApi geschrieben. Jedoch bringt mir das Programm dann beim Complilieren die Fehlermeldung, dass "IMalloc" ein undefinierter Bezeichner ist... Wie behebe ich dieses Problem?


(Ja die SuFu habe ich benutzt)


Andreas L. - Mo 05.06.06 08:54

Hi,
das da brauchste schonmal nicht.

Delphi-Quelltext
1:
2:
// Aufruf:
const CSIDL_APPDATA = $001a;


So, ist das MeinSavePath := GetShellFolder(CSIDL_APPDATA); ne globale Variable? Wenn ja, wo genau im Code versuchst du in die Variable zu schreiben?

Achja, CSIDL_APPDATA ist der Anwendungsdaten-Ordner und nicht der Temp-Ordner. Such mal bei MSDN nach der richtigen CSIDL.


Born-to-Frag - Mo 05.06.06 10:37

Bind noch mal ActiveX ein ;)

greetz


SunnyDream - Mo 05.06.06 11:26

Was für ein Active X soll ich denn einbinden?

@OnlineHome: Die MeinSavePath ist eine gloabale Variable die beim auslesen des Paths verwende. Um genau zu sein in einer Onclick Prozedur wird der Path ausgelesen, da ich ihn dort brauche.


Born-to-Frag - Mo 05.06.06 11:30

Wie, was für eins :shock:

In die uses ActiveX mit aufnehmen...


Gausi - Mo 05.06.06 11:31

user profile iconSunnyDream hat folgendes geschrieben:
Was für ein Active X soll ich denn einbinden?
Ich glaube, er meint uses ActiveX; Hab ich in der Liste vergessen, sorry ;-)

Edit: Naja, doppelt hält besser :mrgreen:


SunnyDream - Mo 05.06.06 11:43

ENDLICH scheint es zu gehen!
Aber da taucht schon der nächste Fehler auf:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Vorschau1Click(Sender: TObject);
begin

MeinSavePath := GetShellFolder(CSIDL_APPDATA);
MeinSavePath := MeinSavePath+'temp.html';
ROutPut.PlainText:= true;
ROutPut.Lines.SaveToFile('MeinSavePath');

   //ausführen der temp.html im Internetexplorer!
  ShellExecute(Handle, 'open''iexplore.exe''"'  + MeinSavePath + '"' , 'C:\Programme\Internet Explorer\', SW_SHOWNORMAL);
end;


"Inkompatible Typen "String" und "PAnsiChar"" in Zeile 10...


Born-to-Frag - Mo 05.06.06 11:48

ShellExecute(Handle, 'open''iexplore.exe', PChar('"'  + MeinSavePath + '"') , 'C:\Programme\Internet Explorer\', SW_SHOWNORMAL);
:mrgreen:


SunnyDream - Mo 05.06.06 11:49

Dank dir, fast schon peinlich wie schlecht ich NOCH bin =(