Autor Beitrag
S - tefano
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 08.09.02 00:22 
Hi,

ich möchte gerne in einem Programm Ordner wie den Desktop ansteuern, um z.B. Verknüpfungen zu erstellen. Jetz gibts ja leider das Problem, dass man den Desktop unter Verschiedenen OS immer an anderen Stellen findet. So isser ja z.B. bei 98 unter \Windows\Desktop. Aber bei XP & Co hat ja jeder Benutzer seinen eigenen Desktop-Ordner. Deshalb muss ich bei meinem Prog erstens herausfinden, unter welchem Betriebssystem es gerade läuft, und: Wenn es ein Multiuser System is (also z.B. xp) muss ich ja rausfinden, welcher User grad angemeldet is, usw....

Hat da einer ne Idee wie ich sowas rausfinden kann?

Bis denn

S - tefano

_________________
Es gibt Tage, an denen verliert man, und es gibt Tage, an denen gewinnen die anderen.
Walk on
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 08.09.02 08:52 
S - tefano hat folgendes geschrieben:
Jetz gibts ja leider das Problem, dass man den Desktop unter Verschiedenen OS immer an anderen Stellen findet.

Ich sehe da kein Problem.

Zitat:
Deshalb muss ich bei meinem Prog erstens herausfinden, unter welchem Betriebssystem es gerade läuft, und: Wenn es ein Multiuser System is (also z.B. xp) muss ich ja rausfinden, welcher User grad angemeldet is, usw....

Muss es nicht.

Zitat:
Hat da einer ne Idee wie ich sowas rausfinden kann?

Ja! Es gibt mehrere API-Funktionen für solche Zwecke. Eine davon wäre diese hier:
ausblenden Quelltext
1:
2:
3:
4:
5:
HRESULT SHGetSpecialFolderLocation(
    HWND hwndOwner,
    int nFolder,
    LPITEMIDLIST* ppidl
);

Die erwartet als zweiten Parameter die CSIDL des gesuchten Ordners. Und da gäbe es z.B.
ausblenden Quelltext
1:
2:
3:
4:
CSIDL_APPDATA
CSIDL_COMMON_APPDATA
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_DESKTOPDIRECTORY

Im MSDN und PSDK findest du noch mehr davon. Und wenn du mal in der Sparte "VCL-Komponenten" suchst, solltest du einen Beitrag finden, der demonstriert, wie man die Favoriten in ein Menü/Listbox einliest. Und zum Herausfinden des Favoritenordners wurde die o.g. Funktion benutzt.
S - tefano Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 08.09.02 13:09 
Hi,

hmm, da werd ich jetz noch nich so ganz schlau draus...
Wie binde ich diesen Code denn in eine Prozedur ein, und was gibt mir dieser Aufruf zurück (also z.B. welchen Typ?)?
Und: Was sind/wo finde ich die MSDN und PSDK?

Thx schonmal

et au revoir

S - tefano

_________________
Es gibt Tage, an denen verliert man, und es gibt Tage, an denen gewinnen die anderen.
Walk on
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 08.09.02 13:40 
Hallo.

MSDN (Microsoft Developers Network), PSDK (Platform SDK, auch von Microsoft - ist auch Teil des MSDN, kostet aber nichts :wink: - nur den Download ...). Die Borland-Hilfedateien haben im Bereich der API-Funktionen leider den Nachteil, nicht aktuell zu sein. Auf den Seiten von Microsoft findest du mehr dazu. Und wenn dich das Thema interessiert, dann wäre ein Download des PSDK empfehlenswert (brauchst aber ´ne DSL-Verbindung oder so was). Das enthält zwar naturgemäß nur C-Beispiele, aber zumindest kommst du so an aktuelle Infos zu Sachen ran, über die sich die Borland-Hilfedateien ausschweigen.

Hier ist mal das besagte Beispiel für den Favoritenordner aus diesem Beitrag:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
uses
  ShellAPI, ShlObj;

function GetFavoritesPath(FavFolder: integer) : string;
var
  lpItemId : PItemIdList;
  buffer   : array[0..MAX_PATH]of char;
begin
  Result := ''// zur Sicherheit

  if(SHGetSpecialFolderLocation(hInstance,FavFolder,lpItemId) = NOERROR) then
    if(SHGetPathFromIDList(lpItemId,buffer)) then
      begin
        Result := strpas(buffer); while(Result[length(Result)] = '\'do
                                    SetLength(Result,pred(length(Result)));
      end;
end;

Die Funktion liefert einen String zurück und lässt sich sehr schön "zweckentfremden", weil sie -trotz ihres Namens!- eigentlich jeden beliebigen Ordner zurückgibt. Du musst halt nur dessen CSIDL kennen.:
ausblenden Delphi-Quelltext
1:
ShowMessage(GetFavoritesPath(CSIDL_DESKTOPDIRECTORY));					

was dir nun deinen Benutzerordner anzeigen sollte.

Wenn du was auf dem Desktop aller Benutzer hinterlassen möchtest, dann benutzt du stattdessen
ausblenden Delphi-Quelltext
1:
CSIDL_COMMON_DESKTOPDIRECTORY					

um den Pfad zu finden.

Wie gesagt, im PSDK findest du noch mehr solche Werte, mit denen du auf so ziemlich alle interessanten Ordner zugreifen kannst.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
S - tefano Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 08.09.02 13:47 
Hi,

wunderbar, danke.
Dann werd ich mal nachlesen gehen.
Die Codes die du gepostet hast, funzen einwanfrei.

Also, danke nochmal.

Bis denn

S - tefano

_________________
Es gibt Tage, an denen verliert man, und es gibt Tage, an denen gewinnen die anderen.
Walk on
S - tefano Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 08.09.02 18:34 
Hi,

also irgendwie krieg ich das mit dem PSDK nich hin. Ich find zwar was bei MS, aber irgendwie find ich mich da drin nicht zurecht. Und downloaden kann ich es irgendwie auch nich, Netscape zeigt gar nix an, und beim IE kommen immer irgendwelche Fehler, weil ich um das Ganze zu ziehen nen neuen WindowsInstaller brauch. Den gibts für Win 95,98, Me oder für NT4.0 und 2000. Ich hab aber leider XP, und dann kommt bei beiden Möglichkeiten ne komische Fehlermeldung, die mir sagen zu wollen scheint, dass ich das falsche OS hab.

Hm. Kann ich mir das PSDK dann gar nich ziehen?

Achja, und diese Frage hatte ich zwischendurch wieder vergessen:
Wie kann ich herausfinden welches OS gerade benutzt wird? Geht das auch über nen API- Befehl?

Bis denn

S - tefano

_________________
Es gibt Tage, an denen verliert man, und es gibt Tage, an denen gewinnen die anderen.
Walk on
S - tefano Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 08.09.02 19:14 
Hi,

hab nur nich lange genug gesucht.
Downloaden geht zwar immernoch nich, aber ich weiß jetz wo ich find wonach ich suche.

cya

S - tefano

_________________
Es gibt Tage, an denen verliert man, und es gibt Tage, an denen gewinnen die anderen.
Walk on
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.09.02 08:01 
S - tefano hat folgendes geschrieben:
Und downloaden kann ich es irgendwie auch nich, Netscape zeigt gar nix an ...

Na, das war doch klar. :wink:

Zitat:
und beim IE kommen immer irgendwelche Fehler, weil ich um das Ganze zu ziehen nen neuen WindowsInstaller brauch.

Schau noch mal richtig nach. Die Fehlermeldung kommt bei mir, weil ich das ActiveX-Control nicht installiert habe, das wohl benötigt wird:
PSDK Seite hat folgendes geschrieben:
This request requires the SDK Update control. This control is not installed on your computer.

Ehrlich: ich weiß auch nicht, was der Unsinn soll, denn immerhin möchte man ja die Dateien downloaden und nicht aus dem Web heraus installieren. Aber so ist eben Microsoft. - Wenn du das Control installieren lässt, dann hast du Zugriff auf die Dateien.

Zitat:
Den gibts für Win 95,98, Me oder für NT4.0 und 2000.
Ich hab aber leider XP, und dann kommt bei beiden Möglichkeiten ne komische Fehlermeldung, die mir sagen zu wollen scheint, dass ich das falsche OS hab.

Bei Win XP ist der Installer 2.0 bereits drin. Zwar nicht ganz so aktuell wie die beiden Redist-Versionen für 9x/ME und NT/2000, aber die Installation des PSDK gelingt später -nach dem erfolgreichen Download :twisted:- trotzdem.

Zitat:
Wie kann ich herausfinden welches OS gerade benutzt wird?
Geht das auch über nen API- Befehl?

Wenn du die Unit "SysUtils" benutzt, dann schau dir mal "Win32Platform" sowie "Win32MajorVersion", "Win32MinorVersion" und "Win32BuildNumber" an.
Direkt mit der API geht das natürlich auch - Stichwort "GetVersionEx". Das ist übrigens auch die Funktion, die hinter den genannten Variablen aus der "SysUtils" steht.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.09.02 19:01 
Und GetUsername liefert dir den aktuell eingeloggten User.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.09.02 20:30 
Das ist zwar richtig, Luckie, aber hier nicht notwendig - mit der richtigen CSIDL liefern dir SHGetSpecialFolderLocation und Co. ja bereits die richtigen Ordner für den jeweils angemeldeten Benutzer zurück. Und darum ging´s S-tefano ja. :-)

Es sei denn natürlich, er braucht den Usernamen noch für andere Zwecke ... vielleicht für die Zwangsaktivierung seines Programms oder so ... :wink:
S - tefano Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mo 09.09.02 21:43 
Cool, dass es dafür auch ne ApiFunktion gibt.
Das sind jetz so meine ersten Schritte in die API- Welt, und bis jetzt bin ich sehr positiv überrascht.
Jetz will ich mal hoffen dass mir nich die Ideen ausbleiben, diese coolen Funktionen zu nutzen.

Danke nochmal an euch alle, habt mir sehr geholfen.

Achja.
Dieses PSDK runterladen geht irgendwie nich, weil ich Norten Antivirus drauf hab. Selbst wenn ich jeden Prozess manuell beende der damit zu tun hat, oder in Norton einstelle, dass er beim Start gar nich ers ladne soll und danach reboote, kommt beim Link zu dieser PSDK Update Enginge son Norton Sicherheitsfehler, der das zu verhindern weiß.
Naja, zum Glück hab ich DSL Flat, kanns also auch problemlos online lesen.

Bis denn

S - tefano

_________________
Es gibt Tage, an denen verliert man, und es gibt Tage, an denen gewinnen die anderen.
Walk on
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.09.02 23:11 
MathiasSimmack hat folgendes geschrieben:
Das ist zwar richtig, Luckie, aber hier nicht notwendig - mit der richtigen CSIDL liefern dir SHGetSpecialFolderLocation und Co. ja bereits die richtigen Ordner für den jeweils angemeldeten Benutzer zurück. Und darum ging´s S-tefano ja. :-)

Es sei denn natürlich, er braucht den Usernamen noch für andere Zwecke ... vielleicht für die Zwangsaktivierung seines Programms oder so ... :wink:


Schon klar, nur hatte er auch danach gefragt, wie er den aktuellen User rausbekommt.