Autor Beitrag
Danniolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 693



BeitragVerfasst: Mi 13.07.05 15:55 
Moin,

Wie kann ich einen (oder mehrere) Einträge in's Startmenü einfügen.
(Mit Delphi natürlich) und ohne die JVCL??? :?: :?:


Moderiert von user profile iconraziel: Topic aus Sonstiges verschoben am Mo 18.07.2005 um 10:14
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Mi 13.07.05 15:58 
Per Registry! Such mal im DF, da findest du bestimmt was!

Suche in: Delphi-Forum, Delphi-Library STARTMENÜ

MfG, ScorpionKing!

_________________
Aus dem Urlaub zurück!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 13.07.05 18:55 
user profile iconScorpionKing hat folgendes geschrieben:
Per Registry!
Jein, dort steht nur, wo sich der Startmenüordner befindet:
ausblenden Quelltext
1:
2:
Alle Benutzer: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Start Menu
Benutzermenü: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Start Menu
Die dort angegebenen Ordner (kann auch der selbe sein !) speichern das eigentliche Startmenü, ab dann geht es nurnoch darum eine Verknüpfung/Datei zu erstellen.

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Mi 13.07.05 18:58 
Stimmt, sorry, da hab ich mich vertan!
Dann könnte man theoretisch da ja eine Verknüpfung (in dem Ordner) ablegen!

_________________
Aus dem Urlaub zurück!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 13.07.05 19:00 
Man sollte aber stattdessen lieber die entsprechende API Funktion nutzen, um die entsprechenden Ordner zu ermitteln.
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Mi 13.07.05 19:01 
user profile iconLuckie hat folgendes geschrieben:
Man sollte aber stattdessen lieber die entsprechende API Funktion nutzen, um die entsprechenden Ordner zu ermitteln.


Diese Funktionen machen aber auch nichts anderes, als es aus der Registry auszulesen!

_________________
Aus dem Urlaub zurück!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 13.07.05 19:05 
Jupp. Aber was, wenn Microsoft im nächsten SP entscheidet, dass sie besser wo anders aufgehoben sind? Dann fällst du auf die Nase. Ich, der die Funktion aus der DLL nutzt, kann sich bequem in seinen Sessel zurücklehnen, da mit dem SP auch die entsprächend geänderte DLL mitgeliefert wird.

Gut, für diese Einträge ist es eher unwahrscheinlich, aber man sollte es sich nicht angewöhnen.
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Mi 13.07.05 19:07 
user profile iconLuckie hat folgendes geschrieben:
Jupp. Aber was, wenn Microsoft im nächsten SP entscheidet, dass sie besser wo anders aufgehoben sind? Dann fällst du auf die Nase. Ich, der die Funktion aus der DLL nutzt, kann sich bequem in seinen Sessel zurücklehnen, da mit dem SP auch die entsprächend geänderte DLL mitgeliefert wird.

Gut, für diese Einträge ist es eher unwahrscheinlich, aber man sollte es sich nicht angewöhnen.


Stimmt, aber ich liebe die Herausforderung! :wink:
Nein, du hast schon Recht, man sollte die API-Funktionen nutzen! :wink:

_________________
Aus dem Urlaub zurück!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 13.07.05 19:26 
user profile iconLuckie hat folgendes geschrieben:
Man sollte aber stattdessen lieber die entsprechende API Funktion nutzen, um die entsprechenden Ordner zu ermitteln.
Weisst du auch, wie diese API Funktion heisst? Oder gönnst du es uns nicht uns dann auch im Sessel zurückzulehnen ;)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Do 14.07.05 13:44 
ausblenden Delphi-Quelltext
1:
ShellApi					

_________________
Aus dem Urlaub zurück!
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Do 14.07.05 13:49 
ShellApi ist kein API-Befehl, sondern eine unit :roll:
wenn man von was keine ahnung hat, ists manchmal besser zu schweigen

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Do 14.07.05 13:54 
user profile iconretnyg hat folgendes geschrieben:
ShellApi ist kein API-Befehl, sondern eine unit :roll:
wenn man von was keine ahnung hat, ists manchmal besser zu schweigen


Sorry, hatte gelesen, welche API! Und das ist nunmal die ShellApi! Dein beitrag ist auch nicht sonderlich hilfreich. Vielleicht hättest du die Funktion mal posten können, anstatt sich zu beschweren! :roll:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
uses JclShell, ShlObj, ShellApi;

var ShellLink: TShellLink;
begin
  CoInitialize(nil);
  with ShellLink do begin
    Arguments:='';
    IdList:=nil;
    WorkingDirectory:='c:\';
    Target:='c:\test.exe';
    Description:='Delphiprog';
  end;
  ShellLinkCreateSystem(ShellLink, CSIDL_COMMON_STARTMENU,
    'Programme\Zubehör\Test.lnk');
  ShellLinkFree(ShellLink);
end;


MfG, ScorpionKing!

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.

_________________
Aus dem Urlaub zurück!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 14.07.05 14:24 
Also in meiner ShellApi gibt's kein CSIDL_COMMON_STARTMENU und bevor ich wieder andere Units benutzt, die evtl. jemand nicht hat, greife ich dann doch lieber auf die Registry zurück - oder im Notfall direkt auf die DLL.

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Do 14.07.05 14:35 
user profile iconmaxk hat folgendes geschrieben:
Also in meiner ShellApi gibt's kein CSIDL_COMMON_STARTMENU und bevor ich wieder andere Units benutzt, die evtl. jemand nicht hat, greife ich dann doch lieber auf die Registry zurück - oder im Notfall direkt auf die DLL.

Gruß,
maxk


Ja, ab er dann hast du das Problem, falls etwas an Windows geändert wird. Nimm lieber oben die Funktion!

_________________
Aus dem Urlaub zurück!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 14.07.05 14:43 
Benötigte Units
ausblenden Delphi-Quelltext
1:
2:
uses
  Windows, ShlObj, ActiveX;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function GetShellFolder(CSIDL: integer): String;
var
  pidl         : PItemIdList;
  FolderPath   : string;
  SystemFolder : Integer;
begin
  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;
end;


Mögliche Konstanten:
ausblenden volle Höhe 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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
const
  CSIDL_FLAG_CREATE      = $8000;
  CSIDL_ADMINTOOLS       = $0030;
  CSIDL_ALTSTARTUP       = $001D;
  CSIDL_APPDATA          = $001A;
  CSIDL_BITBUCKET        = $000A;
  CSIDL_CDBURN_AREA      = $003B;
  CSIDL_COMMON_ADMINTOOLS = $002F;
  CSIDL_COMMON_ALTSTARTUP = $001E;
  CSIDL_COMMON_APPDATA   = $0023;
  CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
  CSIDL_COMMON_DOCUMENTS = $002E;
  CSIDL_COMMON_FAVORITES = $001F;
  CSIDL_COMMON_MUSIC     = $0035;
  CSIDL_COMMON_PICTURES  = $0036;
  CSIDL_COMMON_PROGRAMS  = $0017;
  CSIDL_COMMON_STARTMENU = $0016;
  CSIDL_COMMON_STARTUP   = $0018;
  CSIDL_COMMON_TEMPLATES = $002D;
  CSIDL_COMMON_VIDEO     = $0037;
  CSIDL_CONTROLS         = $0003;
  CSIDL_COOKIES          = $0021;
  CSIDL_DESKTOP          = $0000;
  CSIDL_DESKTOPDIRECTORY = $0010;
  CSIDL_DRIVES           = $0011;
  CSIDL_FAVORITES        = $0006;
  CSIDL_FONTS            = $0014;
  CSIDL_HISTORY          = $0022;
  CSIDL_INTERNET         = $0001;
  CSIDL_INTERNET_CACHE   = $0020;
  CSIDL_LOCAL_APPDATA    = $001C;
  CSIDL_MYDOCUMENTS      = $000C;
  CSIDL_MYMUSIC          = $000D;
  CSIDL_MYPICTURES       = $0027;
  CSIDL_MYVIDEO          = $000E;
  CSIDL_NETHOOD          = $0013;
  CSIDL_NETWORK          = $0012;
  CSIDL_PERSONAL         = $0005;
  CSIDL_PRINTERS         = $0004;
  CSIDL_PRINTHOOD        = $001B;
  CSIDL_PROFILE          = $0028;
  CSIDL_PROFILES         = $003E;
  CSIDL_PROGRAM_FILES    = $0026;
  CSIDL_PROGRAM_FILES_COMMON = $002B;
  CSIDL_PROGRAMS         = $0002;
  CSIDL_RECENT           = $0008;
  CSIDL_SENDTO           = $0009;
  CSIDL_STARTMENU        = $000B;
  CSIDL_STARTUP          = $0007;
  CSIDL_SYSTEM           = $0025;
  CSIDL_TEMPLATES        = $0015;
  CSIDL_WINDOWS          = $0024;
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 14.07.05 14:51 
user profile iconLuckie hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function GetShellFolder(CSIDL: integer): String;
var
  pidl         : PItemIdList;
  FolderPath   : string;
  SystemFolder : Integer;
begin
  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;
end;
Genau das meinte ich. Danke!

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Fr 15.07.05 12:20 
user profile iconretnyg hat folgendes geschrieben:
wenn man von was keine ahnung hat, ists manchmal besser zu schweigen

gut, dass die meisten der df-mitglieder solche überflüssigen kommentare nicht von sich geben.

lg martin
Amiga-Fan
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Fr 15.07.05 13:07 
Zitat:
wenn man von was keine ahnung hat, ists manchmal besser zu schweigen


völlig falsch zitiert. :wink:

Dieter Nuhr: Wenn man keine Ahnung hat, einfach mal die Fresse halten!

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen