unit Shortcut;
interface
uses
Windows, Forms, SysUtils, FileCtrl, ShlObj, ActiveX, ComObj, Registry;
function ShortcutCtrl( path, group, title: string;
func, place, user: char ): boolean;
implementation
//======================================================================
// 機能:ショートカットの作成/削除
//======================================================================
function ShortcutCtrl(
path : string; {ファイルのフルパス}
group: string; {登録グループ名}
title: string; {登録名称}
func : char; {処理区分(C:作成,D:削除)}
place: char; {ショートカットの場所 (M:プログラムメニュー, D:デスクトップ,
S:スタートアップ, Q:クイック起動)}
user : char {対象ユーザー(U:現ユーザーのみ,A:全ユーザー)}
{(注意)全ユーザーを指定時、管理者権限が無いと実行不可}
): boolean;
var
ppmem: IMalloc;
Directory : array[0..MAX_PATH] of Char;
szDirectory: string;
UnknownObject: IUnknown;
psl: IShellLink;
ppf: IPersistFile;
lpi: PItemIDList;
wFileName : WideString;
nFolder: integer;
VerInfo: TOSVersionInfo;
begin
Result := FALSE;
//OS種別を判定し、Win95系なら強制的に現ユーザーのみに変更
VerInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
GetVersionEx( VerInfo );
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then user:='U';
case place of
'M': begin {ショートカットの場所=プログラムメニュー}
if user='U' then nFolder := CSIDL_PROGRAMS
else nFolder := CSIDL_COMMON_PROGRAMS;
end;
'D': begin {ショートカットの場所=デスクトップ}
if user='U' then nFolder := CSIDL_DESKTOPDIRECTORY
else nFolder := CSIDL_COMMON_DESKTOPDIRECTORY;
end;
'S': begin {ショートカットの場所=スタートアップ}
if user='U' then nFolder := CSIDL_STARTUP
else nFolder := CSIDL_COMMON_STARTUP;
end;
'Q': begin {ショートカットの場所=クイック起動}
nFolder := CSIDL_APPDATA;
end;
else Exit;
end;
UnknownObject := CreateComObject(CLSID_ShellLink);
if not Assigned(UnknownObject) then Exit;
psl := UnknownObject as IShellLink;
ppf := UnknownObject as IPersistFile;
if not Assigned(psl) or not Assigned(ppf) then Exit;
if FAILED(ShGetMalloc(ppmem)) then Exit;
if FAILED(SHGetSpecialFolderLocation(0, nFolder, lpi)) then Exit;
if not SHGetPathFromIDList(lpi, Directory) then begin
if Assigned(lpi) then ppmem.Free(lpi);
Exit
end;
if place='Q' then begin {ショートカットの場所=クイック起動}
StrPCopy( Directory, StrPas(Directory)
+ '\Microsoft\Internet Explorer\Quick Launch' );
end;
with psl do begin
SetPath(PChar(path));
SetWorkingDirectory(PChar(ExtractFilePath(path)));
end;
if func='C' then begin {作成時}
if place='M' then begin {ショートカットの場所=プログラムメニュー}
// プログラムメニューに指定グループを作成
StrPCopy( Directory, StrPas(Directory)+'\'+group );
if DirectoryExists(Directory)=FALSE then
ForceDirectories( Directory );
end;
szDirectory := strpas(Directory);
wFileName := szDirectory +'\'+ title + '.lnk';
ppf.Save( PWChar(WFileName), False );
end
else begin {削除時}
if place='M' then begin {ショートカットの場所=プログラムメニュー}
// プログラムメニューに指定グループが有れば
StrPCopy( Directory, StrPas(Directory)+'\'+group );
if DirectoryExists(Directory) then begin
szDirectory := strpas(Directory);
wFileName := szDirectory +'\'+ title + '.lnk';
DeleteFile( wFileName );
RemoveDirectory( Directory );
end;
end
else begin
szDirectory := strpas(Directory);
wFileName := szDirectory +'\'+ title + '.lnk';
DeleteFile( wFileName );
end;
end;
if Assigned(lpi) then ppmem.Free(lpi);
Result := TRUE;
end;
end.
(上記コードをShortcut.pasとして保存する)
<< 使用例 >>
uses Shortcut;
procedure TForm1.Button1Click(Sender: TObject);
begin
if TButton(Sender).Caption='作成' then begin
//プログラムメニューに現ユーザーで作成
ShortcutCtrl( ParamStr(0),'ぐるーぷ','なまえ','C','M','U' );
//デスクトップに全ユーザーで作成
ShortcutCtrl( ParamStr(0),'','なまえ','C','D','A' );
end
else begin
//削除する時
ShortcutCtrl( ParamStr(0),'ぐるーぷ','なまえ','D','M','U' );
ShortcutCtrl( ParamStr(0),'','なまえ','D','D','A' );
end;
end;
(補足)
・グループは「ABC\DEF」の様に階層指定が可能です。
・ショートカットの削除後、グループ内が空になればグループの削除も行います。
但し階層指定時は最下層のフォルダーしか削除されません。
C++Builderから利用する場合は、下記の手順により可能です。
1.上記サンプルをShortcut.pasとして保存し、プロジェクトに追加する
2.#include "Shortcut.hpp"を追加する
3.作成する時は下記の様にコール
ShortcutCtrl( ParamStr(0),"ぐるーぷ","なまえ",'C','M','U' );
ShortcutCtrl( ParamStr(0),"","なまえ",'C','D','A' );
4.削除する時は下記の様にコール
ShortcutCtrl( ParamStr(0),"ぐるーぷ","なまえ",'D','M','U' );
ShortcutCtrl( ParamStr(0),"","なまえ",'D','D','A' );
|
|
・インターネット上の情報や書籍の内容を一部参考に作成してます。 ・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。 ・記述内容に問題点や改善点がありましたらこちらまでお願いします。 |