justdj 13 #254711 Posted February 25, 2015 (edited) Котярко. Не твой код? Не победил воспроизведение по компонентам? [Setup] RawDataResource=SndA:bugreporter_succeeded.wav |SndB:WindowsLogoffSound.wav [code ] #define A = (Defined UNICODE) ? "W" : "A" type HINST = THandle; HMODULE = HINST; Pointer = Longint; HRSRC = THandle; HGLOBAL = THandle; const SND_ASYNC = $0001; SND_NODEFAULT = $0002; SND_MEMORY = $0004; RT_RCDATA = 10; function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall'; function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external '[email protected] stdcall'; function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall'; function LockResource(hResData: HGLOBAL): Pointer; external '[email protected] stdcall'; var pSoundMemory_A, pSoundMemory_B: Pointer; function GetResourceSoundAddr(const ResourceName: String): Pointer; var hResourceSound: HRSRC; begin hResourceSound := FindResource(HInstance, ResourceName, RT_RCDATA); Result := LockResource(LoadResource(HInstance, hResourceSound)); end; procedure ComponentsOnClickCheck(Sender: TObject); begin if IsComponentSelected('KMP\AB') then begin sndPlaySound(pSoundMemory_B, SND_MEMORY or SND_NODEFAULT or SND_ASYNC); end; if IsComponentSelected('KMP\ZK') then begin sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC); end; end; procedure InitializeWizard4(); begin pSoundMemory_A := GetResourceSoundAddr('_IS_SNDA'); pSoundMemory_B := GetResourceSoundAddr('_IS_SNDB'); WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClickCheck; end; Edited February 25, 2015 by justdj Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #254754 Posted February 25, 2015 (edited) [spoiler] Котярко. Не твой код? Не победил воспроизведение по компонентам? [Setup] RawDataResource=SndA:bugreporter_succeeded.wav |SndB:WindowsLogoffSound.wav [code ] #define A = (Defined UNICODE) ? "W" : "A" type HINST = THandle; HMODULE = HINST; Pointer = Longint; HRSRC = THandle; HGLOBAL = THandle; const SND_ASYNC = $0001; SND_NODEFAULT = $0002; SND_MEMORY = $0004; RT_RCDATA = 10; function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall'; function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external '[email protected] stdcall'; function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall'; function LockResource(hResData: HGLOBAL): Pointer; external '[email protected] stdcall'; var pSoundMemory_A, pSoundMemory_B: Pointer; function GetResourceSoundAddr(const ResourceName: String): Pointer; var hResourceSound: HRSRC; begin hResourceSound := FindResource(HInstance, ResourceName, RT_RCDATA); Result := LockResource(LoadResource(HInstance, hResourceSound)); end; procedure ComponentsOnClickCheck(Sender: TObject); begin if IsComponentSelected('KMP\AB') then begin sndPlaySound(pSoundMemory_B, SND_MEMORY or SND_NODEFAULT or SND_ASYNC); end; if IsComponentSelected('KMP\ZK') then begin sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC); end; end; procedure InitializeWizard4(); begin pSoundMemory_A := GetResourceSoundAddr('_IS_SNDA'); pSoundMemory_B := GetResourceSoundAddr('_IS_SNDB'); WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClickCheck; end; более удобный [Setup] AppName=My Program AppVerName=My Program 1.5 DefaultDirName={pf}\My Program DefaultGroupName=My Program ComponentsListTVStyle=true [Files] Source: sounds\*; flags: dontcopy; [Languages] Name: russian; MessagesFile: compiler:Languages\Russian.isl [Components] Name: sound; Description: Звук выстрела; Types: full; Name: sound\snd1; Description: "Тихий"; Flags: exclusive; Name: sound\snd2; Description: "Громкий"; Flags: exclusive; [Code] const LB_ITEMFROMPOINT = $01A9; type TComponentSound = record SoundName: String; Index: Integer; end; TSize = record cx: Longint; cy: Longint; end; ABC = record abcA: Integer; abcB: UINT; abcC: Integer; end; HDC = Longword; HGDIOBJ = Longword; var iSound: array of TComponentSound; sndCompOldProc: TNotifyEvent; function GetCursorPos(var lpPoint: TPoint): BOOL; external '[email protected] stdcall'; function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints: TPoint; cPoints: UINT): Integer; external '[email protected] stdcall'; function GetTextExtentPoint32(DC: HDC; lpString: String; Len: Integer; var lpSize: TSize): Boolean; external '[email protected] stdcall'; function GetClientDC(hWnd: HWND): HDC; external '[email protected] stdcall'; function ReleaseClientDC(hWnd: HWND; hDC: HDC): Integer; external '[email protected] stdcall'; function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; external '[email protected] stdcall'; function GetCharABCWidths(DC: HDC; uFirstChar, uLastChar: UINT; var lpAbc: ABC): Boolean; external '[email protected] stdcall'; function sndPlaySound(lpszSoundName: String; fuSound: UINT): BOOL; external '[email protected] stdcall'; function GetTextWidth(aFont: TFont; Text: String): Integer; var DC: HDC; aSize: TSize; OldObj: Longword; abc1, abc2: ABC; begin if Text='' then Exit; DC:= GetClientDC(0); try OldObj:= SelectObject(DC, aFont.Handle); GetTextExtentPoint32(DC, Text, Length(Text), aSize); Result:= aSize.cx; if (Length(Text)<>1)and(fsItalic in aFont.Style) then begin GetCharABCWidths(DC, Ord(Text[1]), Ord(Text[1]), abc1); GetCharABCWidths(DC, Ord(Text[Length(text)]), Ord(Text[Length(text)]), abc2); if abc1.abcA<0 then Result:= Result-abc1.abcA; if abc2.abcC<0 then Result:= Result-abc2.abcC end; finally SelectObject(DC, OldObj); ReleaseClientDC(0, DC); end; end; procedure PlaySound(Sender: TObject); var x, o, n, lParam, i, f, ids, w1, w2, x1, x2: Integer; p: TPoint; sp, s: String; fnt: TFont; begin GetCursorPos(p); MapWindowPoints(0, WizardForm.ComponentsList.Handle, p, 1); lParam:= p.x or (p.y shl 16); i:= SendMessage(WizardForm.ComponentsList.Handle, LB_ITEMFROMPOINT, 0, lParam); if ((i shr 16) = 1) or ((i and $FFFF) < 0) then Exit; ids:= i and $FFFF; o:= WizardForm.ComponentsList.Offset; n:= WizardForm.ComponentsList.ItemLevel[ids]; if (WizardForm.ComponentsList.TreeViewStyle) then x:= ScaleX((1 + o) + ((13 + o * 2)*(n + 1)) + (14 + o * 2)) else x:= ScaleX((13 + o * 2)*(n + 1)); sp:= ' '+#$266B; f:= -1; for i:= 0 to GetArrayLength(iSound)-1 do begin if (ids = iSound[i].Index) then begin f:= i; Break; end; end; if (f < 0) then Exit; s:= WizardForm.ComponentsList.ItemCaption[ids]; if (Pos(#$266B, s) <= 0) then Exit; fnt:= WizardForm.ComponentsList.Font; fnt.Style:= WizardForm.ComponentsList.ItemFontStyle[i]; w1:= GetTextWidth(fnt, Trim(s)); w2:= GetTextWidth(fnt, sp); x2:= w1 + x; x1:= x2 - w2; if (p.x >= (x1 - 1)) and (p.x <= (x2 + 1)) then begin if FileExists(iSound[f].SoundName) then sndPlaySound(iSound[f].SoundName, 0); end; if (sndCompOldProc <> nil) then sndCompOldProc(Sender); end; procedure AddItemSound(AIndex: Integer; AFilename: String); var i: Integer; begin i:= GetArrayLength(iSound); SetArrayLength(iSound, i+1); iSound[i].Index:= AIndex-1; iSound[i].SoundName:= ExpandConstant(AFilename); WizardForm.ComponentsList.ItemCaption[AIndex-1]:= WizardForm.ComponentsList.ItemCaption[AIndex-1] + ' '+#$266B; end; procedure InitializeWizard(); begin WizardForm.TypesCombo.Visible:=False; WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top; WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top; WizardForm.ComponentsList.Width := ScaleX(417); sndCompOldProc:= WizardForm.ComponentsList.OnClick; WizardForm.ComponentsList.OnClick:= @PlaySound; ExtractTemporaryFile('sound1.wav'); ExtractTemporaryFile('sound2.wav'); AddItemSound(2, '{tmp}\sound1.wav'); AddItemSound(3, '{tmp}\sound2.wav'); end; Edited February 25, 2015 by ♫♫♫Dark_Knight_MiX♫♫♫ 1 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #254761 Posted February 25, 2015 Котярко. Не твой код? Не победил воспроизведение по компонентам? Не мой.Вот подходящий вариант. з.ы. опоздал, он же комментарием выше. 1 Quote Share this post Link to post Short link Share on other sites
justdj 13 #254766 Posted February 25, 2015 Благодарю. Буду разбирать. Не подскажете чем будет отличатся реализация "убивалки процессов" через dll и через системный тасккилл? Что "лучше"? Или одинаково? Мб проблем будет меньше где-то. Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #254771 Posted February 25, 2015 Не подскажете чем будет отличатся реализация "убивалки процессов" через dll и через системный тасккилл? Что "лучше"? Или одинаково? Мб проблем будет меньше где-то. Ну, кмк, либа удобнее, по применению. А по исполнению особой разницы нет. 1 Quote Share this post Link to post Short link Share on other sites
Kaster62rus 3 #255210 Posted February 27, 2015 Помогите разобраться.... Имеется строка кода Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.6\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\O; но в данном варианте это у меня не работает. Зато прекрасно работает вариант Source: C:\Games\World_of_Tanks\res\audio\*; DestDir: {app}\res_mods\0.9.6\audio; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\O; Но что если игра расположена по другому адресу?... Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #255215 Posted February 27, 2015 (edited) Помогите разобраться.... Имеется строка кода Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.6\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\O; но в данном варианте это у меня не работает. Зато прекрасно работает вариант Source: C:\Games\World_of_Tanks\res\audio\*; DestDir: {app}\res_mods\0.9.6\audio; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\O; Но что если игра расположена по другому адресу?... #define Patch "0.9.6" Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\{#Patch}\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\18; Source: "моды\звуки\звонок крита\*"; DestDir: "{app}\res_mods\{#Patch}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\18\1; если у тебя ищет через реестр то не важно по какому пути Edited February 27, 2015 by ♫♫♫Dark_Knight_MiX♫♫♫ Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #255219 Posted February 27, 2015 (edited) {app} - константа выбранной папки приложения пользователем (или же угаданная по реестру), в общем конечная папка, указанная на этапе выбора директории. Это может быть как папка с игрой, так и рабочий стол. Вы же не знаете, что такое справка. Чтобы не было фигни лучше сделать проверку, правильный ли указан путь до папки с игрой. Помогите разобраться. По данному примеру должно работать (если, конечно, за {app} принимается корневая папка игры). Edited February 27, 2015 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
Kaster62rus 3 #255220 Posted February 27, 2015 #define Patch "0.9.6" Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\{#Patch}\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\18; Source: "моды\звуки\звонок крита\*"; DestDir: "{app}\res_mods\{#Patch}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\18\1; если у тебя ищет через реестр то не важно по какому пути А если не через реестр? Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #255226 Posted February 27, 2015 А если не через реестр? а как у вас? Quote Share this post Link to post Short link Share on other sites
Kaster62rus 3 #255230 Posted February 27, 2015 а как у вас? Да понятия не имею если честно. Я весь код кусками собирал, методом научного тыка. Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #255234 Posted February 27, 2015 В том и вся беда ваша - ничего не знаю, но делаю. 1 1 Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #255245 Posted February 27, 2015 Да понятия не имею если честно. Я весь код кусками собирал, методом научного тыка. [Setup] DefaultDirName={code:WotDirNameRU} [Code] function WotDirNameRU(S:String): String; // ключь для основного клиента {1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1 var InsPath: String; er: boolean; myFile:String; begin Result:=ExpandConstant('C:\Games\World_of_Tanks\'); //если ключа нет то будем ставить сюда er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath); if er and (InsPath<>'') then //если ключ существует и там что-то записано begin Result := InsPath; end; end; //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""// function WotDirNameCT(S:String): String; // ключь для тестового клиента {1EAC1D02-C6AC-4FA6-9A44-96258C37C812CT}_is1 var InsPath: String; er: boolean; myFile:String; begin Result:=ExpandConstant('C:\Games\World_of_Tanks_CT\'); //если ключа нет то будем ставить сюда er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812CT}_is1', 'InstallLocation', InsPath); if er and (InsPath<>'') then //если ключ существует и там что-то записано begin Result := InsPath; end; end; Quote Share this post Link to post Short link Share on other sites
Kaster62rus 3 #255247 Posted February 27, 2015 В том и вся беда ваша - ничего не знаю, но делаю. Ну да! В варианте - ЗНАЮ ВСЁ, посетителей на этом форуме было б море... [Setup] DefaultDirName={code:WotDirNameRU} [Code] function WotDirNameRU(S:String): String; // ключь для основного клиента {1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1 var InsPath: String; er: boolean; myFile:String; begin Result:=ExpandConstant('C:\Games\World_of_Tanks\'); //если ключа нет то будем ставить сюда er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath); if er and (InsPath<>'') then //если ключ существует и там что-то записано begin Result := InsPath; end; end; //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""// function WotDirNameCT(S:String): String; // ключь для тестового клиента {1EAC1D02-C6AC-4FA6-9A44-96258C37C812CT}_is1 var InsPath: String; er: boolean; myFile:String; begin Result:=ExpandConstant('C:\Games\World_of_Tanks_CT\'); //если ключа нет то будем ставить сюда er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812CT}_is1', 'InstallLocation', InsPath); if er and (InsPath<>'') then //если ключ существует и там что-то записано begin Result := InsPath; end; end; {1EAC1D02-C6AC-4FA6-9A44-96258C37C812CT} Это ведь не случайный набор символов. Откуда это берётся? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #255252 Posted February 27, 2015 {1EAC1D02-C6AC-4FA6-9A44-96258C37C812CT} Это ведь не случайный набор символов. Откуда это берётся? Это GUID, вычисляется исходя из кучи всяких параметров на компе и текущей даты и времени. GUID случайны и не повторяются ввиду огромного кол-во возможных комбинаций символов. Их часто используют как идентификационные номера или ключи. Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #255253 Posted February 27, 2015 Это GUID, вычисляется исходя из кучи всяких параметров на компе и текущей даты и времени. GUID случайны и не повторяются ввиду огромного кол-во возможных комбинаций символов. Их часто используют как идентификационные номера или ключи. А можно просто вписать что-то своё) 1 Quote Share this post Link to post Short link Share on other sites
Kaster62rus 3 #255254 Posted February 27, 2015 Это GUID, вычисляется исходя из кучи всяких параметров на компе и текущей даты и времени. GUID случайны и не повторяются ввиду огромного кол-во возможных комбинаций символов. Их часто используют как идентификационные номера или ключи. Он как-нибудь связан с этим? #define GameID "{5F05CE9B-7768-490E-9A71-C6R92B4EX123}" ;Ид инстолятора Quote Share this post Link to post Short link Share on other sites
psix_banned 1 #255633 Posted March 1, 2015 (edited) чем можно распаковать созданный данной штукой инсталятор? InnoExtractor ругается что я создал его в модифицированной программе и отказывается рапаковывать Edited March 1, 2015 by psix89 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #255638 Posted March 1, 2015 чем можно распаковать созданный данной штукой инсталятор? InnoExtractor ругается что я создал его в модифицированной программе и отказывается рапаковывать Если инсталл сделан стандартным компилятором - распаковать можно только вложенные в него файлы, если они не криптуются. Если инсталл сделан расширенной версией компилятора, китайской, то никак. 1 Quote Share this post Link to post Short link Share on other sites
psix_banned 1 #255645 Posted March 1, 2015 Если инсталл сделан стандартным компилятором - распаковать можно только вложенные в него файлы, если они не криптуются. Если инсталл сделан расширенной версией компилятора, китайской, то никак. я так понимаю у нас китайский вариант в теме выложен? Quote Share this post Link to post Short link Share on other sites