|
// Siehe auch:
Informationen aus Shortcuts
lesen uses ShlObj, ComObj, ActiveX, Registry;
function AddToStartMenu(ExeName, ProgrammEintrag, ProgrammName,
Beschreibung, Parameter: string): boolean;
var
FObject: IUnknown;
FSLink: IShellLink;
FPFile: IPersistFile;
Folder, Link: string;
FileName: WideString;
Reg: TRegIniFile;
begin
Reg := TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer');
try
FObject := CreateComObject(CLSID_ShellLink);
FSLink := FObject as IShellLink;
FPFile := FObject as IPersistFile;
with FSLink do begin
SetPath(PChar(ExeName));
SetArguments(PChar(Parameter));
SetWorkingDirectory(PChar(ExtractFilePath(ExeName)));
SetDescription(PChar(Beschreibung));
SetIconLocation(PChar(ExeName), 0);
end;
Folder := Reg.ReadString('Shell Folders', 'Programs', '') + '\' +
ProgrammEintrag;
if CreateDir(Folder) then begin
Link := '\' + ProgrammName + '.lnk';
FileName := Folder + Link;
FPFile.Save(PWChar(FileName), False);
Result := true;
end else
Result := false;
except
Result := false;
end;
Reg.Free;
end;
// Beispielufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
if not AddToStartMenu(application.exename, 'Mein Programm', 'Testprogramm',
'Test', '') then showmessage('Fehler');
end;
//
------------------------------------------------------------- uses Shlobj, ActiveX, ComObj, FileCtrl;
const
Lnk: string = '';
Ordner: string = '';
IID_IPersistFile: TGUID =
(D1: $0000010B; D2: $0000; D3: $0000;
D4: ($C0, $00, $00, $00, $00, $00, $00, $46));
// stammt aus OLE2.PAS
function SpezialOrdner(welcher: integer): string;
var
pidl: PItemIDList;
Pfad: PChar;
Malloc: IMalloc;
begin
result := '';
SHGetMalloc(Malloc);
if Malloc = nil then exit;
if SHGetSpecialFolderLocation(0, welcher, pidl) = NOERROR
then begin
Pfad := StrAlloc(max_path);
if SHGetPathFromIDList(pidl, Pfad) then begin
result := Pfad;
if ansilastchar(result) <> '\' then result := result + '\';
end;
StrDispose(Pfad);
Malloc.Free(pidl);
end;
end;
function makeLink(was, wohin: string): boolean;
var
isl: IShellLink;
ipf: IPersistFile;
begin
result := false;
if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
IID_IShellLinkA, isl))
then begin
isl.SetPath(PChar(was));
if SUCCEEDED(isl.QueryInterface(IID_IPersistFile, ipf)) then
result := ipf.Save(StringToOLEStr(wohin), true) = S_OK;
end;
end;
// Beispielufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
// zunächst das Erstellen der Gruppe "MyNewGroup"
// (als Beispiel im Ordner "Startmenü/Programme"),
Ordner := SpezialOrdner(CSIDL_Programs);
if Ordner <> '' then begin
Ordner := Ordner + 'MyNewGroup';
if (not CreateDirectory(PChar(Ordner), nil))
and (getlasterror <> ERROR_ALREADY_EXISTS)
then showmessage('Erstellen der Programmgruppe fehlgeschlagen')
else begin
// dann die lnk-Datei erzeugen
Lnk := 'EuroStck.lnk';
if ansilastchar(Ordner) <> '\' then Ordner := Ordner + '\';
if not makeLink('D:\Programme\EuroStck.exe', Ordner + Lnk)
then showmessage('Shortcut wurde nicht erstellt');
end;
end else showmessage('Spezial-Ordner nicht aufgefunden');
end;
// Beides wieder löschen
procedure TForm1.Button2Click(Sender: TObject);
begin
if FileExists(Ordner + Lnk) then
if not deletefile(PChar(Ordner + Lnk)) then
showmessage('Shortcut konnte nicht gelöscht werden');
if DirectoryExists(Ordner) then
if not RemoveDirectory(PChar(Ordner))
then showmessage('Löschen der Programmgruppe fehlgeschlagen');
end;
//
"Spezial-Ordner" //
------------------------------------------------------------- uses ShlObj, ActiveX, ComObj;
procedure MakeLink(Was, Parameter, Wohin,
IconQuelle: string; IconStelle: integer);
var
IUK: IUnknown;
ISL: IShellLink;
IPF: IPersistFile;
begin
IUK := CreateComObject(CLSID_ShellLink);
ISL := IUK as IShellLink;
IPF := IUK as IPersistFile;
ISL.SetPath(PChar(Was));
if Parameter <> '' then
ISL.SetArguments(pchar(Parameter));
ISL.SetWorkingDirectory(pChar(ExtractFilePath(Was)));
if AnsiLastChar(Wohin) <> '\' then Wohin := Wohin + '\';
if IconQuelle <> '' then
ISL.SetIconLocation(pchar(IconQuelle), IconStelle);
IPF.Save(StringToOLEStr(Wohin +
ChangeFileExt(ExtractFilename(Was), '.lnk')), false);
end;
// Verknüpfung mit einem Parameter und dem ursprünglichen Icon
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeLink('D:\Programme\EuroStck.exe', 'MyParameter', 'C:\', '', 0);
end;
// Verknüpfung ohne Parameter, aber mit anderem Icon
procedure TForm1.Button2Click(Sender: TObject);
begin
MakeLink('D:\Programme\EuroStck.exe', '', 'C:\',
'Shell32.dll', 51);
end;
//------------------------------------------------------------- uses Winapi.ShlObj, Winapi.ActiveX;
function CreateLink(aFileName, aWorkingdir, aLinkFileName, aParameter,
aLinkDestination, aIconsource: String; aIconplace: integer): Boolean;
var
ISL: IShellLink;
IPF: IPersistFile;
begin
Result := False;
aLinkDestination := IncludeTrailingPathDelimiter(aLinkDestination);
if not FileExists(aFileName) then
exit;
if not DirectoryExists(aLinkDestination) then
exit;
if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_inPROC_SERVER,
IID_IShellLinkW, ISL)) then
begin
ISL.SetPath(PWideChar(aFileName));
ISL.SetArguments(PWideChar(aParameter));
ISL.SetWorkingDirectory(PWideChar(aWorkingdir));
ISL.SetIconLocation(PWideChar(aIconsource), aIconplace);
if SUCCEEDED(ISL.QueryInterface(IPersistFile, IPF)) then
begin
IPF.Save(PWideChar(aLinkDestination + aLinkFileName + '.lnk'), True);
Result := True;
end;
end;
end;
// Beispielaufruf (Link auf Desktop)
procedure TForm1.Button1Click(Sender: TObject);
var
pdl: PItemIDList;
P: Pchar;
s, quelle: string;
stelle: integer;
begin
GetMem(P, max_path);
SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOPDIRECTORY, pdl);
SHGetPathFromIDList(pdl, P);
s := P;
FreeMem(P);
quelle := 'Shell32.dll'; // 'D:\WinSpy.exe';
stelle := 23; // 0;
if not CreateLink('D:\WinSpy.exe', 'D:\', 'TestName', 'MyParameter', s,
quelle, stelle) then
ShowMessage('FEHLER');
end;
|





