Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]
R.i.m.s.k.y.
02-01-2012, 19:42
kangreon, именно поэтому я привел рабочий код
Gnom_aka_Lexander
02-01-2012, 20:05
Закрепить ярлык на панели задач в Windows 7 (вариант №1) - пример закрепления ярлыка приложения на панели задач в Windows 7, (ссылка на сообщение);
Закрепить ярлык на панели задач в Windows 7 (вариант №2) - пример закрепления ярлыка приложения на панели задач в Windows 7, (ссылка на сообщение); »
Вариант 2 у меня не работает: повисает на строчке
for i := 0 to LoadString(hInst, 5386, buf[0], 255)-1 do strVerb := strVerb + Chr(Buf[i]);
в выделенной части. Это первый вопрос, поскольку вариант 2 для меня оптимальнее было-бы использовать.
Второй вопрос - никто не думал над тем, как удалять этот ярлык при деинсталляции?
KaStieL139
02-01-2012, 23:15
здраствуйте, помоги пж! как сделать эксклюзивный инсталлятор? ( ну там с чёрным фоном и картинкой )
KaStieL139, вот скрипт скина и отображения фоновых картинков, насчет черного фона треубется ISSkin и изменения (выделено черным).
#define NeedSize "15000"
[Setup]
AppName=Napoleon. Total War
AppVerName=Napoleon. Total War
DefaultDirName={pf}\Napoleon. Total War
DisableReadyPage=true
[Languages]
Name: Rus; MessagesFile: "compiler:Languages\Russian.isl";
[Files]
Source: compiler:ISSkin.dll; DestDir: {tmp}; Flags: dontcopy;
Source: Tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy;
Source: Image1.bmp; DestDir: {tmp}; Flags: dontcopy;
Source: Image2.bmp; DestDir: {tmp}; Flags: dontcopy;
Source: Image3.bmp; DestDir: {tmp}; Flags: dontcopy;
Source: Image4.bmp; DestDir: {tmp}; Flags: dontcopy;
[CustomMessages]
Rus.Welcome=Вас приветствует Мастер установки {#SetupSetting("AppName")}.%nПрограмма установит {#SetupSetting("AppName")} на Ваш компьтер.
Rus.SelectDir=Программа установит игру {#SetupSetting("AppName")} в следующую папку.%nЕсли вы хотите выбрать другую папку, нажмите «Обзор».%nНажмите «Установить», чтобы начать установку игры {#SetupSetting("AppName")}.
Rus.Installing=Пожалйуста, подождите, пока игра {#SetupSetting("AppName")} утсновится на Ваш компьютер.
Rus.Finished=Установка игры {#SetupSetting("AppName")} завершена.%nВы можете запустить игру с помощью%n соответствующего ярлыка на «Рабочем столе» или из меню «Пуск».
Rus.FreeSize=Доступно места на диске:
Rus.NeedSize=Требуется места на диске:
[_code]
var
BackPanel, WizardPanel, StatusPanel, ImagePanel: TPanel;
CaptionLabel: TLabel; BmpFile: TBitmapImage;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal; NeedSize: Integer;
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';
Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;
procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Гб' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ IntToStr(FreeMB)+ ' Мб';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True;
end;
procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Гб' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ IntToStr(NeedSize)+ ' Мб';
end;
function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;
procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;
procedure InitializeWizard();
begin
NeedSize:= {#NeedSize};
ExtractTemporaryFile('Image1.bmp')
ExtractTemporaryFile('Image2.bmp')
ExtractTemporaryFile('Image3.bmp')
ExtractTemporaryFile('Image4.bmp')
WizardForm.ClientWidth:= ScaleX(800);
WizardForm.ClientHeight:= ScaleY(620);
WizardForm.Position:= poScreenCenter;
WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.Font.Name:= 'Georgia';
BackPanel:= TPanel.Create(WizardForm)
BackPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(800), ScaleY(618))
BackPanel.Color:= clWhite
BackPanel.BorderStyle:= bsNone
BackPanel.ParentBackground:= False
BackPanel.ParentColor:= False
BackPanel.Parent:= WizardForm
StatusPanel:= TPanel.Create(WizardForm)
StatusPanel.SetBounds(ScaleX(2), ScaleY(2), ScaleX(796), ScaleY(18))
StatusPanel.BorderStyle:= bsNone
StatusPanel.ParentBackground:= False
StatusPanel.ParentColor:= False
StatusPanel.Font.Color:= clWhite
StatusPanel.Font.Size:= 12
StatusPanel.Font.Style:= [fsBold]
StatusPanel.Font.Name:= 'Times New Roman'
StatusPanel.Alignment:= taCenter
StatusPanel.Parent:= WizardForm
ImagePanel:= TPanel.Create(WizardForm)
ImagePanel.SetBounds(ScaleX(2), ScaleY(21), ScaleX(796), ScaleY(484))
ImagePanel.BorderStyle:= bsNone
ImagePanel.ParentBackground:= False
ImagePanel.ParentColor:= False
ImagePanel.Parent:= WizardForm
BmpFile:= TBitmapImage.Create(WizardForm)
BmpFile.Stretch:= True;
BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(796), ScaleY(484))
BmpFile.Parent:= ImagePanel
WizardPanel:= TPanel.Create(WizardForm)
WizardPanel.SetBounds(ScaleX(2), ScaleY(506), ScaleX(796), ScaleY(110))
WizardPanel.Alignment:= taCenter;
WizardPanel.BorderStyle:= bsNone
WizardPanel.ParentBackground:= False
WizardPanel.ParentColor:= False
WizardPanel.Parent:= WizardForm
CaptionLabel:= TLabel.Create(WizardForm);
CaptionLabel.SetBounds(ScaleX(100), ScaleY(5), ScaleX(590), ScaleY(100));
CaptionLabel.AutoSize:= False;
CaptionLabel.WordWrap:= True;
CaptionLabel.Transparent:= True;
CaptionLabel.Font.Color:= $5F8BA2
CaptionLabel.Font.Size:= 11
CaptionLabel.Font.Style:= [fsBold]
CaptionLabel.Alignment:= taCenter;
CaptionLabel.Parent:= WizardPanel;
NeedSpaceLabel:= TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(5),ScaleY(70),ScaleX(300),ScaleY(20))
NeedSpaceLabel.Transparent:= True;
NeedSpaceLabel.Font.Style:= [fsBold]
NeedSpaceLabel.Parent:= WizardPanel
FreeSpaceLabel:= TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(250), ScaleY(70), ScaleX(300),ScaleY(20))
FreeSpaceLabel.Transparent:= True;
FreeSpaceLabel.Font.Style:= [fsBold]
FreeSpaceLabel.Parent:= WizardPanel
WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
WizardForm.DirBrowseButton.Parent:= WizardForm
WizardForm.DirBrowseButton.Left:= ScaleX(455)
WizardForm.DirBrowseButton.Top:= ScaleY(590)
WizardForm.DirBrowseButton.Font.Size:= 8
WizardForm.DirBrowseButton.Font.Style:= [fsBold]
WizardForm.DirEdit.Parent:= WizardForm
WizardForm.DirEdit.Left:= ScaleX(5)
WizardForm.DirEdit.Top:= ScaleY(590)
WizardForm.DirEdit.Width:= ScaleX(445)
WizardForm.DirEdit.Font.Size:= 8
WizardForm.DirEdit.Font.Style:= [fsBold]
WizardForm.ProgressGauge.Parent:= WizardForm
WizardForm.ProgressGauge.Left:= ScaleX(5)
WizardForm.ProgressGauge.Top:= ScaleY(590)
WizardForm.ProgressGauge.Width:= ScaleX(450)
WizardForm.StatusLabel.Parent:= WizardPanel
WizardForm.StatusLabel.SetBounds(ScaleX(5), ScaleY(52), ScaleX(300), ScaleY(20))
WizardForm.StatusLabel.Font.Style:= [fsBold]
WizardForm.FilenameLabel.Parent:= WizardPanel
WizardForm.FilenameLabel.SetBounds(ScaleX(5), ScaleY(68), ScaleX(450), ScaleY(20))
WizardForm.FilenameLabel.Font.Style:= [fsBold]
WizardForm.CancelButton.BringToFront;
WizardForm.CancelButton.Left:= ScaleX(715)
WizardForm.CancelButton.Top:= ScaleY(590)
WizardForm.CancelButton.Font.Size:= 8
WizardForm.CancelButton.Font.Style:= [fsBold]
WizardForm.NextButton.BringToFront;
WizardForm.NextButton.Left:= ScaleX(630)
WizardForm.NextButton.Top:= ScaleY(590)
WizardForm.NextButton.Font.Size:= 8
WizardForm.NextButton.Font.Style:= [fsBold]
WizardForm.BackButton.BringToFront;
WizardForm.BackButton.Left:= ScaleX(545)
WizardForm.BackButton.Top:= ScaleY(590)
WizardForm.BackButton.Font.Size:= 8
WizardForm.BackButton.Font.Style:= [fsBold]
end;
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.DirEdit.Hide; WizardForm.DirBrowseButton.Hide;
WizardForm.Progressgauge.Hide; WizardForm.StatusLabel.Hide;
WizardForm.FilenameLabel.Hide; FreeSpaceLabel.Hide;
NeedSpaceLabel.Hide;
case CurPageID of
wpWelcome:
begin
CaptionLabel.Caption:= ExpandConstant('{cm:Welcome}')
StatusPanel.Caption:= 'Приветствие'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'))
end;
wpSelectDir:
begin
WizardForm.DirEdit.Show; WizardForm.DirBrowseButton.Show;
FreeSpaceLabel.Show; NeedSpaceLabel.Show;
CaptionLabel.Caption:= ExpandConstant('{cm:SelectDir}')
StatusPanel.Caption:= 'Подготовка к установке'
WizardForm.NextButton.Caption:= 'Установить'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image2.bmp'))
GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False;
end;
wpInstalling:
begin
WizardForm.Progressgauge.Show; WizardForm.StatusLabel.Show;
WizardForm.FilenameLabel.Show;
CaptionLabel.Caption:= ExpandConstant('{cm:Installing}')
StatusPanel.Caption:= 'Установка'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image3.bmp'))
end;
wpFinished:
begin
CaptionLabel.Caption:= ExpandConstant('{cm:Finished}')
StatusPanel.Caption:= 'Завершение'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image4.bmp'))
end;
end;
end;
KaStieL139
03-01-2012, 02:42
Alert30 спасибо большое, а можешь написать что нужно делать в IS Skin? заранее спасибо!
Devils Night
03-01-2012, 03:37
Закрепить ярлык на панели задач в Windows 7 »Тоже заинтересовал вопрос по поводу.
Нашёл только это (http://forum.ru-board.com/topic.cgi?forum=5&topic=33457&start=40#9). Слушайте, а вот без заморочек с кодами и реестром можно это как то обойти? А то уж больно всё запущено.
KaStieL139
03-01-2012, 03:38
Люди подскажите пж что вот здесь писать
http://i074.radikal.ru/1201/74/d39dd8743bdd.jpg
мне в этом скрипте почти всё непонятно, незнаю где что прописывать! мне хотябы что бы в инсталляторе была картинка! а остальное не важно! а как сделать не знаю((((
KaStieL139,
а можешь написать что нужно делать в IS Skin? »
мне в этом скрипте почти всё непонятно, незнаю где что прописывать! мне хотя бы что бы в инсталляторе была картинка! а остальное не важно! а как сделать не знаю(((( »
Необходимо скачать DLL-ку ISSkin.7z в аттачменте, распаковать - будет папка, который внутри лежит эта DLL-ка; потом его положить в C:\Program Files\Inno Setup 5, затем можешь использовать стиль Inno Setup в формате .cjstyles (код выделено черным жирным шрифтом).
P.S. В общем этот общий готовый скрипт, должен получится так.
http://i28.fastpic.ru/big/2012/0101/47/67cd9c88d9e88b12baba2f4872c98747.png
P.S.S. Если что выкладываю готовые скрипты от BadBoy: http://rghost.ru/35718036
El Sanchez
03-01-2012, 13:27
Вариант 2 у меня не работает: повисает на строчке »
Лександер, уверен, что на этой? Массив buf не пуст на этом этапе? Другими словами, LoadString отрабатывает? hInst не равен 0? Ты не первый кто жалуется на зависон, может антивирь не дает в shell32.dll залазить? В общем есть повод пересмотреть код.
Второй вопрос - никто не думал над тем, как удалять этот ярлык при деинсталляции? »
Лександер, метод тот же, ресурс другой будет - 5387.
KaStieL139
03-01-2012, 15:03
я в формате cjstyles ничего не нашёл((
kotkovets
03-01-2012, 15:54
никто не думал над тем, как удалять этот ярлык при деинсталляции? »
изменить идентификатор 5386 на 5387, далее уже ясно как:
or i := 0 to LoadString(hInst, 5387, buf[0], 255)-1 do strVerb := strVerb + Chr(Buf[i]);
В русскоязычной оси 5386 - Закрепить на &панели задач
В русскоязычной оси 5387 - Открепить от &панели задач
Gnom_aka_Lexander
03-01-2012, 17:21
может антивирь не дает в shell32.dll »
не антивирьуверен, что на этой? »
уверен, раскладываел ее на составляющие:
for i := 0 to
LoadString(hInst, 5386, buf[0], 255)-1
do
strVerb := strVerb + Chr(Buf[i]);на выделенном виснет навсегда :)
El Sanchez
03-01-2012, 19:03
на выделенном виснет навсегда »
Лександер, ок, а без Chr?:
...
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external LoadStringA@user32.dll stdcall';
...
buf: array [0..255] of char;
...
for i := 0 to LoadString(hInst, 5386, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
...
Gnom_aka_Lexander
03-01-2012, 20:01
El Sanchez, так-же:
http://rghost.ru/35724940/image.png (http://rghost.ru/35724940.view)
Компилю на юникоде, замена вызова LoadStringA на LoadStringW вообще дает ошибку невозможно загрузить длл
Возможно. косяк системы - Скрипт Кастомного шрифта, у меня тоже не работает - виснет на оповещении системы.
ПРичем, это косяк не инно - пробовал делать длл, и вызывать функцию из нее - результат аналогичный.
El Sanchez, извиняюсь, но немного подправил ваш скрипт Закрепить ярлык на панели задач в Windows 7 (вариант №2) (http://forum.oszone.net/post-1754564-3111.html).
Сделал в виде примера с кнопками...
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
AppCopyright=Copyright © El Sanchez
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
[Code]
const
BUF_SIZE = 1024;
LOAD_LIBRARY_AS_DATAFILE = 2;
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExA@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: UINT; lpBuffer: PChar; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function GetDllResourceStr(const Index: Integer): string;
var
hLibrary: THandle;
iSize: Integer;
begin
Result := '';
hLibrary := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hLibrary <> 0 then
try
SetLength(Result, BUF_SIZE);
iSize := LoadString(hLibrary, Index, PChar(Result), BUF_SIZE);
if iSize > 0 then
SetLength(Result, iSize)
else
Result := '';
finally
FreeDLL(hLibrary);
end;
end;
function AddTaskbarWin7(const FileName: string): Boolean;
var
i: Integer;
strVerb: string;
objShell, colVerbs: Variant;
begin
strVerb := GetDllResourceStr(5386);
if not FileExists(Filename) or (strVerb = '') then Exit;
try
objShell := CreateOleObject('Shell.Application');
except
ShowExceptionMessage;
Exit;
end;
colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
for i := colVerbs.Count downto 1 do
if colVerbs.Item[i].Name = strVerb then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
end;
function DelTaskbarWin7(const FileName: string): Boolean;
var
i: Integer;
strVerb: string;
objShell, colVerbs: Variant;
begin
strVerb := GetDllResourceStr(5387);
if not FileExists(Filename) or (strVerb = '') then Exit;
try
objShell := CreateOleObject('Shell.Application');
except
ShowExceptionMessage;
Exit;
end;
colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
for i := colVerbs.Count downto 1 do
if colVerbs.Item[i].Name = strVerb then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
end;
procedure AddButtonClick(Sender: TObject);
begin
// Присобачим Блокнот на панель задач
if AddTaskbarWin7('c:\windows\notepad.exe') then
MsgBox('ok', mbInformation, MB_OK)
else
MsgBox('no', mbInformation, MB_OK);
end;
procedure DelButtonClick(Sender: TObject);
begin
// Удялим Блокнот из панели задач
if DelTaskbarWin7('c:\windows\notepad.exe') then
MsgBox('ok', mbInformation, MB_OK)
else
MsgBox('no', mbInformation, MB_OK);
end;
procedure InitializeWizard();
begin
if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
begin
with TButton.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(ScaleX(16), ScaleY(327), ScaleX(75), ScaleY(25));
Caption := 'Добавить';
OnClick := @AddButtonClick;
end;
with TButton.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(ScaleX(128), ScaleY(327), ScaleX(75), ScaleY(25));
Caption := 'Удалить';
OnClick := @DelButtonClick;
end;
end;
end;
El Sanchez
03-01-2012, 22:50
Serega, Лександер, спасибо за багрепорт, пофиксил скрипт для ANSI/Unicode:
[Code]
const
LOAD_LIBRARY_AS_DATAFILE = $2;
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function PinToTaskbarWin7(Filename: String; IsPin: Boolean): Boolean;
//Filename: full path to executable file
//IsPin: False - unpin from TaskBar, True - pin to TaskBar
var
hInst: THandle;
buf: array [0..255] of char;
i, Res: Integer;
strVerb: String;
objShell, colVerbs: Variant;
begin
if not FileExists(Filename) then Exit;
if IsPin then Res := 5386 else Res := 5387;
if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
begin
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
try
objShell := CreateOleObject('Shell.Application');
except
ShowExceptionMessage;
Exit;
end;
colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
finally
FreeDLL(hInst);
end;
end;
end;
procedure InitializeWizard();
begin
PinToTaskbarWin7('c:\windows\notepad.exe', True);
end;
El Sanchez, вы не много не поняли, а именно вы составляете название по одному символу, хотя достаточно вызвать функцию LoadString один раз и затем обрезать лишнее...
Посмотрите функцию GetDllResourceStr в моём сообщении выше.
Второй вопрос - никто не думал над тем, как удалять этот ярлык при деинсталляции? »
дык вроде если закреплять ярлык созданный через [Icons], деинсталятор сам его удаляет
есть еще один подводный камень - т.к. сам инсталятор 32bit и создаваемый OLE тоже выполняется в 32bit-контексте, закрепить программу из нативной x64 папки по нормальному не удаётся - ярлык закрепляется, но запущенная программа отображается отдельной кнопкой, которую можно/нужно закрепить вручную
Gnom_aka_Lexander
04-01-2012, 10:43
Serega, проблема тут, теперь:
http://rghost.ru/35732095/image.png (http://rghost.ru/35732095.view)
ПРимер El Sanchez, заработал.
Общий пример както так:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
AppCopyright=Copyright © El Sanchez
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
[*Code]
const
LOAD_LIBRARY_AS_DATAFILE = $2;
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
var
AddBtn : TButton;
Pined:Boolean;
function PinToTaskbarWin7(Filename: String; IsPin: Boolean): Boolean;
//Filename: full path to executable file
//IsPin: False - unpin from TaskBar, True - pin to TaskBar
var
hInst: THandle;
buf: array [0..255] of char;
i, Res: Integer;
strVerb: String;
objShell, colVerbs: Variant;
begin
if not FileExists(Filename) then Exit;
if IsPin then Res := 5386 else Res := 5387;
if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
begin
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
try
objShell := CreateOleObject('Shell.Application');
except
ShowExceptionMessage;
Exit;
end;
colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
finally
FreeDLL(hInst);
end;
end;
end;
procedure AddDelClick(Sender: TObject);
begin
case Pined of
False:
begin;
// Присобачим Блокнот на панель задач
PinToTaskbarWin7('c:\windows\notepad.exe', True);
AddBtn.Caption := 'Удалить';
Pined:=True;
end;
True:
begin;
// Уберем Блокнот на панель задач
PinToTaskbarWin7('c:\windows\notepad.exe', False);
AddBtn.Caption := 'Добавить';
Pined:=False;
end;
end;
end;
procedure InitializeWizard();
begin
if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
begin
AddBtn:= TButton.Create(WizardForm);
with AddBtn do
begin
Parent := WizardForm;
SetBounds(ScaleX(16), ScaleY(327), ScaleX(75), ScaleY(25));
Caption := 'Добавить';
OnClick := @AddDelClick;
end;
Pined:=False;
end;
end;
дык вроде если закреплять ярлык созданный через [Icons], деинсталятор сам его удаляет »
Покажи мне, неумному, как это будет через секцию [Icons] выглядеть?
El Sanchez
04-01-2012, 11:03
Serega, проблема тут, теперь:
читать дальше » »
Лександер, для юникода сменить тип переменной i на integer.
El Sanchez, вы не много не поняли, а именно вы составляете название по одному символу»
Serega, реализация мне понятна, но я выбрал цикл. :)
хотя достаточно вызвать функцию LoadString один раз и затем обрезать лишнее... »
for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do »
В циклах со счетчиком начальные/конечные значения переменной цикла вычисляются один раз, поэтому LoadString не будет работать вхолостую.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.