-
Здравствуйте !
Пытаюсь создать программу для инсталляции. Естественно, нужно, чтобы она размещала на раб.столе пользователя (и хорошо бы - в меню программ) ярлык, указывающий на экзешник. Install Shield с диска Делфи7 прекрасно это делает, но нужен самодельный инсталлятор. То есть нужно создать ярлык, задать адрес и задать иконку. Далее вроде бы, могу поместить ее в ресурс, а при инсталляции - извлечь.
-
> То есть нужно создать ярлык, задать адрес и задать иконку. > Далее вроде бы, могу поместить ее в ресурс, а при инсталляции > - извлечь.
Ну так и создай. Руками. И в ресурс помести. Но будет жестко привязана к адресу. Значит создай, посмотри, где пишется адрес, и при инсталляции меняй его.
-
Вот и используй Install Shield, оно много чего делает и делает правильно.
-
Создать ярлык:
function MakeShortcut(const sFName, sLnk, sWorkDir, sArgs, sIconFile: string;
IconIndex: integer): boolean;
var CO: IUnknown;
begin
Result := False;
CO := CreateComObject(CLSID_ShellLink);
try
with IShellLink(CO) do
begin
if SetPath(PChar(sFName)) <> S_OK then exit;
if sIconFile <> '' then
if SetIconLocation(PChar(sIconFile), IconIndex) <> S_OK then exit;
if SetArguments(PChar(sArgs)) <> S_OK then exit;
if SetWorkingDirectory(PChar(sWorkDir)) <> S_OK then exit;
end;
Result := Succeeded((CO as IPersistFile).Save(PWChar(WideString(sLnk)), False))
finally
CO := Unassigned
end
end;
Получить путь для ярлыка:
function GetFullMenuPath(const S: string): string;
var PIDL: PItemIDList;
TempPath: array[0..MAX_PATH] of Char;
Dir: integer;
begin
Result := '';
if S = '' then Dir := CSIDL_DESKTOPDIRECTORY
else Dir := CSIDL_COMMON_PROGRAMS;
SHGetSpecialFolderLocation(Application.Handle, Dir, PIDL);
if PIDL <> nil then
begin
SHGetPathFromIDList(PIDL, TempPath);
Result := string(TempPath) + '\';
GlobalFreePtr(PIDL)
end
end;
Вызов:
MakeShortcut(ParamStr(0),
GetFullMenuPath('')+'\Qwerty1.lnk',
ExtractFileDir(ParamStr(0)),
'/H',
ExtractFilePath(ParamStr(0)) + 'FileWithIcon.exe', 0
)
-
Спасибо большое !
-
Здравствуйте !
Действительно, все это прекрасно работает. Возможно, кому-нибудь пригодятся мои комментарии: (* Разборка (комментарии): Необходимо добавит в uses: ShlObj, ComOBJ, ActiveX
CLSID_ShellLink - описана в ShlObj.pas : {$EXTERNALSYM CLSID_ShellLink} CLSID_ShellLink: TGUID = ( D1:$00021401; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46)); ---------- IShellLink - интерфейс описан в ShlObj.pas SetPath - описан в ShlObj.pas: function SetPath(pszFile: PAnsiChar): HResult; stdcall; ---------- SetIconLocation - описана в ShlObj.pas function SetIconLocation(pszIconPath: PAnsiChar; iIcon: Integer): HResult; stdcall; ---------- SetArguments - описана в ShlObj.pas function SetArguments(pszArgs: PAnsiChar): HResult; stdcall; -------- SetWorkingDirectory - описана в ShlObj.pas function SetWorkingDirectory(pszDir: PAnsiChar): HResult; stdcall; --------- Succeeded - описана в Windows.pas {$EXTERNALSYM Succeeded} function Succeeded(Status: HRESULT): BOOL; ---------- IPersistFile - интерфейс описан в ActiveX.pas { IPersistFile interface } {$EXTERNALSYM IPersistFile} IPersistFile = interface(IPersist) ['{0000010B-0000-0000-C000-000000000046}'] function IsDirty: HResult; stdcall; function Load(pszFileName: POleStr; dwMode: Longint): HResult;stdcall; function Save(pszFileName: POleStr; fRemember: BOOL): HResult;stdcall; function SaveCompleted(pszFileName: POleStr): HResult;stdcall; function GetCurFile(out pszFileName: POleStr): HResult;stdcall; end; *)
Вызов функции немного изменил, чтобы создавать ярлык для инсталлированной программы, а не для инсталлятора: MakeShortcut(papka+'\TXTPLAYER.EXE', GetFullMenuPath('')+'\TXTPLAYER.lnk', // Если ярлык - на рабочий стол papka, '/H', papka+'\TXTPLAYER.EXE', 0); где papka - строка, хранящая имя папки, в которую инсталлирована программа (ярлык создается позже копирования файлов в эту папку), TXTPLAYER.EXE - имя инсталлируемой программы. TXTPLAYER.lnk - имя ярлыка, создаваемого на рабочем столе.
-
> TXTPLAYER
проигрыватель текстов? типа аудиокнига голосом робота? просто интересно...
-
Не, просто переформатирует файлы *.txt так, чтобы при просмотре в mp3-плеере (например, Kingston KPEX-100) сохранялся перенос на новую строку. Мне кажется, это удобнее, а я много читаю в KPEX-100 - чтобы не сидеть за компом, а читать мануалы лежа на диване. В моих комментариях дефект: не указал, что .SetPath - .SetIconLocation - .SetArguments - .SetWorkingDirectory - это методы интерфейса IShellLink
|