PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [71] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Johny777
21-12-2012, 04:45
El Sanchez, К сожалению имеется серьёзная проблема с кодом распаковки архивов 7зип, вылетают ошибки
раньше думал, что конфликт с таймерами (Вин Апи) и с подменённой оконной процедурой (пару страниц назад показывал), но вот убрал их все для теста и ситуация не улучшилась :(
вот примеры ошибок:

http://img211.imageshack.us/img211/6161/90963387.png (http://imageshack.us/photo/my-images/211/90963387.png/)
http://img43.imageshack.us/img43/1074/43926798.png (http://imageshack.us/photo/my-images/43/43926798.png/)
http://img689.imageshack.us/img689/8748/97401570.png (http://imageshack.us/photo/my-images/689/97401570.png/)
http://img72.imageshack.us/img72/8322/41553565.png (http://imageshack.us/photo/my-images/72/41553565.png/)
http://img21.imageshack.us/img21/7318/93086433.png (http://imageshack.us/photo/my-images/21/93086433.png/)

последняя с ошибкой указателя иногда выделяет строку RtlMoveMemory(ei, _lpEis, SizeOf(ei));
также бывает "stack overflow" если раскомментировать PercentsLabel.Caption := FormatFloat('0.#0 %', (dwCurrentSize*100)/ei.dwFileSize); на 4-м скрине
всё крутится вокруг каллбэк функции
Поймать ошибки трудно. Запускал в цикле - 1 устанока = 1, 2 ошибки ингда в начале цикла иногда к 10 - 20 распаковке (цикл длиной от 1 до 30), пару раз из около 10 тестовых установок бывало без ошибки
Признаю: код очень классный и урезать(или даже отказаться от использования) очень трудно
Просьба: Если есть шанс исправить положение, то прошу помочь!

El Sanchez
21-12-2012, 15:43
Johny777,
1. Зачем тебе wide string? Передаешь в 7z юникод (кириллицу)? Не выйдет, нужно по-другому: в функциях SevenZipCreateArchive и SevenZipExtractArchive после формирования комстроки s7cmd допиши CharToOemBuff(s7cmd).
2. SevenZipKillOwnerWindowEx(hWnd). К дескриптору какого окна callback привязан? Можешь просто 0 передавать.
3. RtlMoveMemory. Тут по указателю получаем структуру. В момент ошибки _lpEis указывает на невесть что.
4. Встроенный прогресс работает при тех же архивах?

Johny777
21-12-2012, 15:53
Зачем тебе wide string »
1. не исключено тк в бэкапере сохранение по умолчанию на рабочий стол и если пользователь обозвал себя русскими буквами то сохранение не работает
также без wide string не идёт распаковка в темп, а она тоже желательна если сохранять архив,
CharToOemBuff(s7cmd). »
сейчас попробую
2. нули и стояли
3. Я читал, что функция малость глючная http://www.delphimaster.net/view/4-1086735785
4. работает, на нём и отображаю

Dark_Delphin
21-12-2012, 18:41
Помогите, пожалуйста. Пост #1455

Johny777
21-12-2012, 19:38
Dark_Delphin, проблема была в том, что ты скрыл OuterNotebook на котором лежал InnerNotebook, на котором в свою очередь лежал родной прогрессбар
поправил:

#define MyAppVersion "1.0"

#define NeedInstallSize 90
#define NeedMem 512
#define GameName "MineCraft"
#define GameExeFile "MinecraftLauncher.exe"
#define GameVersion "1.4.5"



[Setup]
AppId={{F5DC10AE-A774-4AB9-9DAE-1BC585C1710B}
AppName={#GameName}
DefaultDirName={userappdata}\.minecraft
AppVersion={#MyAppVersion}
DefaultGroupName=\{#GameName}
WizardImageFile=Files\WizardImage.bmp
SetupIconFile=Files\Ico.ico
DisableDirPage=yes
DisableFinishedPage=yes
DisableProgramGroupPage=yes
DisableReadyPage=yes

SolidCompression=yes
Compression=lzma/ultra

[Icons]
Name: "{userdesktop}\{#GameName}"; Filename: "{app}\{#GameExeFile}"; WorkingDir: "{app}"; Check: "CheckError";
Name: "{group}\{#GameName}"; Filename: "{app}\{#GameExeFile}"; WorkingDir: "{app}"; Check: "CheckError";
Name: "{group}\Delete"; Filename: "{app}\unins000.exe"; WorkingDir: "{app}"; Check: "CheckError";

[Files]
Source: "Files\unarc.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "Files\ISDone.dll"; DestDir: {tmp}; Flags: dontcopy

Source: "ISSkinU.dll"; DestDir: {app}; Attribs: hidden system
Source: "s.skin"; DestDir: {app}; Attribs: hidden system
Source: {fonts}\*; DestDir: {app}; Flags: external


[ code]
var
LabelPct, CrackedLabel, StatusLabel: Tlabel;
ISDoneProgressBar: TNewProgressBar;
ISDoneCancel:integer;
ISDoneError:boolean;
PCFVer:double;

NewButton1: TNewButton;

const
PCFonFLY=true;
notPCFonFLY=false;



type
TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;



function ReleaseCapture: Longint;
external 'ReleaseCapture@user32.dll stdcall';


procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(WizardForm.Handle,$0112,$F012,0);
end;


procedure NewButton1Click(Sender: TObject);
begin
MsgBox(ExpandConstant('{cm:info}')
, mbInformation, MB_OK);

// Caption := ExpandConstant('{cm:NewButton1}');

end;


procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskinu.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskinu.dll stdcall delayload setuponly';

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskinu.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskinu.dll stdcall delayload uninstallonly';


function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
if OveralPct<=1000 then ISDoneProgressBar.Position := OveralPct;
LabelPct.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
ResumeProc;
end;

function CheckError:boolean;
begin
result:= not ISDoneError;
end;


procedure InitializeWizard();
begin
NewButton1 := TNewButton.Create(WizardForm);



WizardForm.DirEdit.Enabled:=true;
// WizardForm.DirBrowseButton.Enabled:=false;

with WizardForm do begin
Bevel.Hide;
OuterNotebook.Hide;

ClientWidth:=300;
ClientHeight:=400;
Position:=poScreenCenter;
Caption:='{#GameName} v{#GameVersion}';
with WizardBitmapImage do begin
Parent:=WizardForm;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(300), ScaleY(400));
end;

WizardBitmapImage.OnMouseDown:=@LabelOnMouseDown;

with NextButton do begin
SetBounds(ScaleX(87), ScaleY(50), ScaleX(130), ScaleY(40));
Cursor := crHand;
Font.size:=14;
end;


with NewButton1 do begin
Parent := WizardForm;
SetBounds(ScaleX(87), ScaleY(100), ScaleX(130), ScaleY(40));
OnClick := @NewButton1Click;
Caption := ExpandConstant('{cm:NewButton1}');
Cursor := crHand;
Font.size:=14;
end;


with CancelButton do begin

SetBounds(ScaleX(87), ScaleY(267), ScaleX(130), ScaleY(40));
Cursor := crHand;
Font.size:=14;
end;

with DirBrowseButton do begin
Parent:=WizardForm;
SetBounds(ScaleX(87), ScaleY(150), ScaleX(130), ScaleY(40));
Cursor := crHand;
Font.size:=14;
end;

with DirEdit do begin
Parent:=WizardForm;
SetBounds(ScaleX(87), ScaleY(230), ScaleX(130), ScaleY(40));

end;
end;


ISDoneProgressBar:=TNewProgressBar.Create(WizardForm);
with ISDoneProgressBar do begin
Parent:=WizardForm;
SetBounds(ScaleX(9), ScaleY(202), ScaleX(280), ScaleY(23));
Max:=1000;
end;
WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.SetBounds(ScaleX(9), ScaleY(202), ScaleX(280), ScaleY(23));
WizardForm.ProgressGauge.Hide;
LabelPct:=TLabel.Create(WizardForm);
with LabelPct do begin
Parent:=ISDoneProgressBar;
AutoSize:=False;
Transparent:=True;
Alignment:=taCenter;
SetBounds(ScaleX(0), ScaleY(4), ScaleX(280), ScaleY(23));
Font.Style:=[fsBold];
end;
StatusLabel := TLabel.Create(WizardForm);
with StatusLabel do begin
Parent:=WizardForm;
AutoSize:=True;
Transparent:=True;
SetBounds(ScaleX(100), ScaleY(225), ScaleX(0), ScaleY(0));
Caption := ExpandConstant('{cm:unpack}');
Font.Color:=clWhite;
end;


CrackedLabel:=TLabel.Create(WizardForm);
with CrackedLabel do begin
Parent:=WizardForm;
AutoSize:=true;
Transparent:=True;
SetBounds(ScaleX(30), ScaleY(195), ScaleX(130), ScaleY(0));

Caption := ExpandConstant('{cm:crack}');
Font.Color:=clred;
Alignment:=taCenter;
end;



end;

procedure CurPageChanged(CurPageID: Integer);
begin
CrackedLabel.Hide;
WizardForm.DirBrowseButton.Hide; WizardForm.DirEdit.Hide;
ISDoneProgressBar.Hide; StatusLabel.Hide;
case CurPageID of
wpWelcome: begin
CrackedLabel.Show;
WizardForm.DirBrowseButton.Show; WizardForm.DirEdit.Show;
end;
wpInstalling: begin
WizardForm.CancelButton.SetBounds(ScaleX(465), ScaleY(202), ScaleX(63), ScaleY(23));
ISDoneProgressBar.Show; StatusLabel.Show;
end;
end;
end;

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;

function MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
Result:= NumToStr(Float/(1024*1024))+' Тб';
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
FreeMB, TotalMB: Cardinal;
begin
Result := True;
if CurPageID = wpWelcome then begin
GetSpaceOnDisk(ExtractFileDrive(WizardForm.DirEdit.Text), True, FreeMB, TotalMB);
if FreeMB<{#NeedInstallSize} then begin
MsgBox('Недостаточно места на жёстком диске!'#13'Для установки необходимо: '+MbOrTb({#NeedInstallSize})+#13'Свободно '+MbOrTb(FreeMB)+' из '+MbOrTb(TotalMB), mbError, mb_Ok);
Result := False ;
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
Comps1,Comps2,Comps3, TmpValue:cardinal;
FindHandle1,ColFiles1,CurIndex1,tmp:integer;
ExecError:boolean;
InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
case CurStep of
ssInstall: begin
WizardForm.CancelButton.OnClick := @CancelButtonOnClick;
ISDoneCancel:=0;
ExtractTemporaryFile('unarc.dll');

WizardForm.ProgressGauge.Show;
Comps1:=0;
Comps2:=0;
Comps3:=0;

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
repeat

////////////////////////////////////////
// if not ISArcExtract ( 0, 0, ExpandConstant('{src}\setup.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
/////////////////////////////////////////////

ISDoneError:=false;
until true;
ISDoneStop;
end;
end;
ssPostInstall: begin
if ISDoneError then begin
StatusLabel.Caption:='Откат изменений...';
ISDoneProgressBar.Hide;
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;
end;
end;

procedure InitializeUninstallProgressForm;
begin
UninstallProgressForm.CancelButton.Hide;
UninstallProgressForm.Bevel.Hide;
UninstallProgressForm.Bevel1.Hide;
UninstallProgressForm.ClientHeight := 100;
UninstallProgressForm.Position:=poScreenCenter
UninstallProgressForm.MainPanel.Hide;
UninstallProgressForm.InnerNotebook.Top:=0
UninstallProgressForm.InnerNotebook.Left:=0
end;


function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('s.skin');
LoadSkin(ExpandConstant('{tmp}\s.skin'), '');
Result:= true
end;

function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskinu.dll'),
ExpandConstant('{tmp}\isskinu.dll'), False);
FileCopy(ExpandConstant('{app}\s.skin'),
ExpandConstant('{tmp}\s.skin'), False); LoadSkinU(ExpandConstant('{tmp}\s.skin'), '');
Result:=True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;

procedure DeinitializeUninstall();
begin
UnloadSkinU();
end;



[UninstallDelete]
Type: "filesandordirs"; Name: "{app}";

[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "ukr"; MessagesFile: "compiler:Languages\Ukrainian.isl"
Name: "eng"; MessagesFile: "compiler:Languages\English.isl"

Name: "czc"; MessagesFile: "compiler:Languages\Czech.isl"
Name: "ger"; MessagesFile: "compiler:Languages\German.isl"

Name: "jap"; MessagesFile: "compiler:Languages\Japanese.isl"
Name: "pol"; MessagesFile: "compiler:Languages\Polish.isl"








[Messages]
rus.ButtonNext=Ð*аспаковать
rus.ButtonCancel=Выход
rus.ButtonWizardBrowse=Обзор...
rus.SetupAppTitle={#GameName}

ukr.ButtonNext=Ð*озпакувати
ukr.ButtonCancel=Вихід
ukr.ButtonWizardBrowse=Огляд...
ukr.SetupAppTitle={#GameName}

eng.ButtonNext=Unpack
eng.ButtonCancel=Exit
eng.ButtonWizardBrowse=Browse...
eng.SetupAppTitle={#GameName}

czc.ButtonNext=Rozbalte
czc.ButtonCancel=Konec
czc.ButtonWizardBrowse=Procházet...
czc.SetupAppTitle={#GameName}

ger.ButtonNext=auspacken
ger.ButtonCancel=Exit
ger.ButtonWizardBrowse=Durchsuchen...
ger.SetupAppTitle={#GameName}

jap.ButtonNext=アンパック
jap.ButtonCancel=終了
jap.ButtonWizardBrowse=参照...
jap.SetupAppTitle={#GameName}

pol.ButtonNex =Rozpakuj
pol.ButtonCancel=Wyjście
pol.ButtonWizardBrowse=PrzeglÄ…daj ...
pol.SetupAppTitle={#GameName}


[CustomMessages]
rus.NewButton1=Прочитай
rus.info= - Упаковал Dark_Delphin;%n - ИП сервера: 46.4.83.69:25586;%n - Форум: torrents-nn.org.ua/forum/26;%n - Скайп: LetsLook1;

ukr.NewButton1=Прочитай
ukr.info= - Упакував Dark_Delphin;%n - ІП сервера: 46.4.83.69:25586;%n - Форум: torrents-nn.org.ua/forum/26;%n - Скайп: LetsLook1;

eng.NewButton1=Read
eng.info= - Packed by Dark_Delphin;%n - ІP server: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

czc.NewButton1=čÃ*st
czc.info= - Baleno po Dark_Delphin;%n - ІP serveru: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

ger.NewButton1=Lesen
ger.info= - Verpackt durch Dark_Delphin;%n - ІP server: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

jap.NewButton1=èª*ã‚€
jap.info= - でランチ Dark_Delphin;%n - ІPサーバー: 46.4.83.69:25586;%n - フォーラãƒ*: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

pol.NewButton1=czytać
pol.info= - pakowane przez Dark_Delphin;%n - ІP serwer: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

rus.unpack=Ð*аспаковка...
ukr.unpack=Ð*озпакування...
eng.unpack=Unpacking...
czc.unpack=RozbalenÃ*...
ger.unpack=Auspacken...
jap.unpack=解凍...
pol.unpack=Rozpakowanie...

rus.crack=!ВНИМАНИЕ!%n Не рекомендуется изменять путь распаковки!
ukr.crack=!УВАГА!%n Не рекомендується змінювати шлях розпакування!
eng.crack=!WARNING!%n Avoid changing the way decompress!
czc.crack=!VAROVÁNÍ!%n VyhnÄ›te se mÄ›nÃ* způsob, jakým rozbalit!
ger.crack=!WARNUNG!%n Vermeiden Sie das Ändern der Weg zu entpacken!
jap.crack=! è*¦å‘Šï¼%n 方法は解凍変更することは避けてくã*さい!
pol.crack=!UWAGA!%n Należy unikać zmiany sposobu dekompresji!



PS: за каракули в коде меня не пинать :), так и было

===============================================================================

El Sanchez, добавил CharToOemBuff(s7cmd)
убрал для теста AnsiToDos() из
s7cmd := 'a "' + AnsiToDos(ArchiveFilename) + '" "' + RemoveQuotes(FileList[0]) + '"';
получил
s7cmd := 'a "' + ArchiveFilename + '" "' + RemoveQuotes(FileList[0]) + '"';
всё равно ошибка stack overflow на строке RtlMoveMemory(ei, _lpEis, SizeOf(ei)); :(

также вчера пробовал заменить функцию RtlMoveMemory
на дельфийскую
тк инно ассемблер не может убрал в библиотеку код:

library Memory;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes,
Windows;

{$R *.res}

{ Объявляем функцию }
(* ***** BEGIN LICENSE BLOCK *****
*
* The assembly function Move is licensed under the CodeGear license terms.
*
* The initial developer of the original code is Fastcode
*
* Portions created by the initial developer are Copyright (C) 2002-2004
* the initial developer. All Rights Reserved.
*
* Contributor(s): John O'Harrow
*
* ***** END LICENSE BLOCK ***** *)
procedure Move(const Source; var Dest; count : Integer);
{$IFDEF PUREPASCAL}
var
S, D: PAnsiChar;
I: Integer;
begin
S := PAnsiChar(@Source);
D := PAnsiChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;
{$ELSE}
asm
cmp eax, edx
je @@Exit {Source = Dest}
cmp ecx, 32
ja @@LargeMove {Count > 32 or Count < 0}
sub ecx, 8
jg @@SmallMove
@@TinyMove: {0..8 Byte Move}
jmp dword ptr [@@JumpTable+32+ecx*4]
@@SmallMove: {9..32 Byte Move}
fild qword ptr [eax+ecx] {Load Last 8}
fild qword ptr [eax] {Load First 8}
cmp ecx, 8
jle @@Small16
fild qword ptr [eax+8] {Load Second 8}
cmp ecx, 16
jle @@Small24
fild qword ptr [eax+16] {Load Third 8}
fistp qword ptr [edx+16] {Save Third 8}
@@Small24:
fistp qword ptr [edx+8] {Save Second 8}
@@Small16:
fistp qword ptr [edx] {Save First 8}
fistp qword ptr [edx+ecx] {Save Last 8}
@@Exit:
ret
nop {4-Byte Align JumpTable}
nop
@@JumpTable: {4-Byte Aligned}
dd @@Exit, @@M01, @@M02, @@M03, @@M04, @@M05, @@M06, @@M07, @@M08
@@LargeForwardMove: {4-Byte Aligned}
push edx
fild qword ptr [eax] {First 8}
lea eax, [eax+ecx-8]
lea ecx, [ecx+edx-8]
fild qword ptr [eax] {Last 8}
push ecx
neg ecx
and edx, -8 {8-Byte Align Writes}
lea ecx, [ecx+edx+8]
pop edx
@FwdLoop:
fild qword ptr [eax+ecx]
fistp qword ptr [edx+ecx]
add ecx, 8
jl @FwdLoop
fistp qword ptr [edx] {Last 8}
pop edx
fistp qword ptr [edx] {First 8}
ret
@@LargeMove:
jng @@LargeDone {Count < 0}
cmp eax, edx
ja @@LargeForwardMove
sub edx, ecx
cmp eax, edx
lea edx, [edx+ecx]
jna @@LargeForwardMove
sub ecx, 8 {Backward Move}
push ecx
fild qword ptr [eax+ecx] {Last 8}
fild qword ptr [eax] {First 8}
add ecx, edx
and ecx, -8 {8-Byte Align Writes}
sub ecx, edx
@BwdLoop:
fild qword ptr [eax+ecx]
fistp qword ptr [edx+ecx]
sub ecx, 8
jg @BwdLoop
pop ecx
fistp qword ptr [edx] {First 8}
fistp qword ptr [edx+ecx] {Last 8}
@@LargeDone:
ret
@@M01:
movzx ecx, [eax]
mov [edx], cl
ret
@@M02:
movzx ecx, word ptr [eax]
mov [edx], cx
ret
@@M03:
mov cx, [eax]
mov al, [eax+2]
mov [edx], cx
mov [edx+2], al
ret
@@M04:
mov ecx, [eax]
mov [edx], ecx
ret
@@M05:
mov ecx, [eax]
mov al, [eax+4]
mov [edx], ecx
mov [edx+4], al
ret
@@M06:
mov ecx, [eax]
mov ax, [eax+4]
mov [edx], ecx
mov [edx+4], ax
ret
@@M07:
mov ecx, [eax]
mov eax, [eax+3]
mov [edx], ecx
mov [edx+3], eax
ret
@@M08:
fild qword ptr [eax]
fistp qword ptr [edx]
end;
{$ENDIF}


procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;

procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte);
begin
FillChar(Destination^, Length, Fill);
end;

procedure ZeroMemory(Destination: Pointer; Length: DWORD);
begin
FillChar(Destination^, Length, 0);
end;


{ Экспортируем функцию для дальнейшего
использования программой }
exports
MoveMemory,
CopyMemory,
FillMemory,
ZeroMemory;


{ Инициализация переменных }
begin

end.

загрузил из библиотеки процедуру, при распаковке архива опять что-то с указателями
но как я понял функции аналогичны, хотя может дело и не в RtlMoveMemory

прикладываю на всякий случай библиотеку, скрипт с импортом функций, исходник библиотеки
процедуры:
procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD); external 'CopyMemory@files:Memory.dll stdcall';
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD); external 'CopyMemory@files:Memory.dll stdcall';
procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte); external 'CopyMemory@files:Memory.dll stdcall';
procedure ZeroMemory(Destination: Pointer; Length: DWORD); external 'CopyMemory@files:Memory.dll stdcall';

Dark_Delphin
21-12-2012, 20:11
Johny777, Спасибо.
Ничё страшного, это не проблема)

DEZMONDS
21-12-2012, 20:57
Доброе время суток назрел очень интересный вопрос.

Сделал репак программы в коде прописал что бы в хост блокировался оф сайт ... но вот в чем проблема программа все ровно проверяет файлы каким образом не знаю. Но что интересное нашел когда при выключенном инете в ручной активации на win 7 в директории C:\ProgramData создается папка моей проги и в ней кидается файл с лицензией и далее все работает ..даже с включеным инетом.

нужный процесс опишу: win 7
Пункты:

1.Запускаем установку выбираем директорию установки по умолчанию (диск "C:\Program Files (x86)") все программа устанавливается копируются ключи реестра и т.д. создается ярлык.
2.Помимо этого хотелось что бы в пути "C:\ProgramData" в которой создалась предварительно папка по пункту "1" еще установился нужный мне файл для активации программы. (файл присутствует в "скрипте" и в программе )

Нужно так что бы этот файл из установленной программы копировался или переместился в указанную мной директорию. "C:\ProgramData"

Я понимаю что это константа для win7 но так же хотелось и узнать код для ХР/Win 8/Vista

читал форум наткнулся на код константы для хр {pf} но так и не понял ....

надеюсь мысль правильно изложил потому как не знаю как это действие называется красиво.

Помогите пожалуйста подскажите код для константы программных файлов для win7/win8/xp/vista

Gnom_aka_Lexander
21-12-2012, 21:06
C:\ProgramData - {localappdata} Для любой системы. просто в ХР и в системах выше ХР она ведет в разные места. но этот путь всегда будет правильным.

El Sanchez
21-12-2012, 21:16
C:\ProgramData - {localappdata} »
Gnom_aka_Lexander, нет. Правильно будет - {%ALLUSERSPROFILE}
Помогите пожалуйста подскажите код для константы программных файлов для win7/win8/xp/vista »
DEZMONDS, в справке в разделе Constants найдете описание почти всех констант.

Gnom_aka_Lexander
21-12-2012, 21:19
El Sanchez, извиняюсь, попутал, имел в виду {commonappdata}...

SoulSide
22-12-2012, 00:34
DEZMONDS, Вот (http://forum.oszone.net/attachment.php?attachmentid=93632&stc=1&d=1359459286) некоторая инфа.

DEZMONDS
22-12-2012, 01:54
{%ALLUSERSPROFILE} »
то есть мне в скрипте в разделе files надо прописать это и файл рядом который я хочу кинуть в ту директорию верно?

#define MyAppName "Unity 3D"
#define MyAppVersion "4.0.7f"
#define MyAppPublisher "DEZMONDS, Inc."
#define MyAppURL "http://vk.com/id176764657"
#define MyAppExeName "Unity.exe"

[Setup]
; Ïðèìå÷àíèå: Çíà÷åíèå AppId èäåíòèôèöèðóåò ýòî ïðèëîæåíèå.
; Íå èñïîëüçóéòå îäíî è òîæå çíà÷åíèå â ðàçíûõ óñòàíîâêàõ.
; (Äëÿ ãåíåðàöèè çíà÷åíèÿ GUID, íàæìèòå Èíñòðóìåíòû | Ãåíåðàöèÿ GUID.)
AppId={{0A2076A7-42C3-43A2-9147-B57604BD35D4}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
LicenseFile=C:\Users\DEZMONDS\Desktop\licenzi .txt
OutputDir=E:\DEZMONDS\Ïðîáíèê ðåïàêîâ\ñïèçäèë
OutputBaseFilename=Unity 3d Setup
SetupIconFile=D:\Âñå äëÿ ñàéòà\Mega_Pack_Top_Icons\ico\Edonkey Nitro.ico
Compression=lzma
SolidCompression=yes
DiskSpanning=true
DiskSliceSize=1457664000
WizardSmallImageFile=6608927.bmp
WizardImageFile=unity3d.bmp

[Languages]
Name: english; MessagesFile: compiler:Languages\English.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1

[Files]
Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; {%ALLUSERSPROFILE}
Source: E:\Unity_4.0.7f\Unity.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\beast32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\beast64.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\cairo.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\CFLite.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\comerr32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\fmod_editor.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\fmod_editor.pdb; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\FreeImage.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\gssapi32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\iconv.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\JavaScriptCore.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\k5sprt32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\krb5_32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libcurl.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libeay32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libiconv2.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libintl3.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libmp3lame.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libpq.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libxml2.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libxslt.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\mfc80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\mfc80u.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Microsoft.VC80.CRT.manifest; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Microsoft.VC80.MFC.manifest; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\mono.pdb; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\MonoDevelop.lnk; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcm80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcp80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcr71.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcr80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\pthreadVC2.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\sqlite3.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\ssleay32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\umbraoptimizer32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\umbraoptimizer64.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Uninstall.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Unity.pdb; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\UnityBugReporter.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\UnityWebPlayer.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\WebKit.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\zlib1.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; Ïðèìå÷àíèå: Íå èñïîëüçóéòå "Flags: ignoreversion" äëÿ ñèñòåìíûõ ôàéëîâ

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent

procedure CurStepChanged(CurStep: TSetupStep); begin If CurStep=ssPostInstall then begin
SaveStringToFile(ExpandConstant('{sys}')+'\drivers\etc\hosts', #13 #10 + '127.0.0.1 unity3d.com', True);
end; end;

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: DisplayName; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: Publisher; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: HelpLink; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: URLInfoAbout; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: UninstallString; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: QuietUninstallString; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: DisplayIcon; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: Directory; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: un.Directory; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: UnityWebPlayerDevelopment; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: UnityWebPlayerReleaseChannel; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x; ValueType: string; ValueName: kProjectBasePath; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x; ValueType: string; ValueName: LastOpenedScene; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x\Location; ValueType: string; ValueName: ; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x; ValueType: string; ValueName: kProjectBasePath; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x\Location; ValueType: string; ValueName: ; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\UnityEditor; ValueType: string; ValueName: Editor StatsDone; ValueData: {app}; Flags: uninsdeletekey


вот сам скрипт я в него добавил {%ALLUSERSPROFILE} правильно*?

SoulSide
22-12-2012, 02:53
вот сам скрипт я в него добавил {%ALLUSERSPROFILE} правильно*? »Всё так, только правильней будет не:
Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; {%ALLUSERSPROFILE}
а
Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE};
Забыли добавить DestDir:.

Для убедительности пути назначения, можете опробовать скрипт по умолчанию, т.е

[Setup]
AppName=AppName
AppVersion=1.5
DefaultDirName={pf}\AppName
DefaultGroupName=AppName
OutputDir=.

Для теста вместо {pf} заменяете на {%ALLUSERSPROFILE}

[Setup]
AppName=AppName
AppVersion=1.5
DefaultDirName={%ALLUSERSPROFILE}\AppName
DefaultGroupName=AppName
OutputDir=.

пробуете: запускаете установку и смотрите куда показывает путь, а потом смело вставляете значение туда куда вам нужно в секции [Files].
Только учтите, таким образом удастся проверить не все константы.

R.i.m.s.k.y.
22-12-2012, 07:07
Господа, товарищи, и неопределившиеся :)
Кто работал с либой mediainfo.dll? как в ней вытаскивать параметры файла из инно???

Gnom_aka_Lexander
22-12-2012, 13:12
R.i.m.s.k.y., вот, чего смог - навыковыривал из исходников.

type
TMIStreamKind =(Stream_General, Stream_Video, Stream_Audio, Stream_Text, Stream_Chapters, Stream_Image, Stream_Menu, Stream_Max);
TMIInfo = (Info_Name, Info_Text, Info_Measure, Info_Options, Info_Name_Text, Info_Measure_Text, Info_Info, Info_HowTo, Info_Max);
TMIInfoOption = (InfoOption_ShowInInform, InfoOption_Reserved, InfoOption_ShowInSupported, InfoOption_TypeOfValue, InfoOption_Max);

#ifdef UNICODE
type PMyChar = string;
#define ext "_"
#else
#define ext "A_"
type PMyChar = PAnsiChar;
#endif

function MediaInfo_New(): Cardinal;
external 'MediaInfo{#ext}New files@MediaInfo.Dll stdcall';

procedure MediaInfo_Delete(Handle: Cardinal);
external 'MediaInfo{#ext}Delete files@MediaInfo.Dll stdcall';

function MediaInfo_Open(Handle: Cardinal; mFile: PMyChar): Cardinal;
external 'MediaInfo{#ext}Open files@MediaInfo.Dll stdcall';

procedure MediaInfo_Close(Handle: Cardinal);
external 'MediaInfo{#ext}Close files@MediaInfo.Dll stdcall';

function MediaInfo_Inform(Handle: Cardinal; Reserved: Integer): PMyChar;
external 'MediaInfo{#ext}Inform files@MediaInfo.Dll stdcall';

function MediaInfo_GetI(Handle: Cardinal; StreamKind: TMIStreamKind; StreamNumber: Integer; Parameter: Integer; KindOfInfo: TMIInfo): PMyChar;
external 'MediaInfo{#ext}GetI files@MediaInfo.Dll stdcall';

function MediaInfo_Get(Handle: Cardinal; StreamKind: TMIStreamKind; StreamNumber: Integer; Parameter: PMyChar; KindOfInfo: TMIInfo; KindOfSearch: TMIInfo): PMyChar;
external 'MediaInfo{#ext}Get files@MediaInfo.Dll stdcall';

function MediaInfo_Option(Handle: Cardinal; Option: PMyChar; Value: PMyChar): PMyChar;
external 'MediaInfo{#ext}Option files@MediaInfo.Dll stdcall';

function MediaInfo_State_Get(Handle: Cardinal): Integer;
external 'MediaInfo{#ext}State_Get files@MediaInfo.Dll stdcall';

function MediaInfo_Count_Get(Handle: Cardinal; StreamKind: TMIStreamKind; StreamNumber: Integer): Integer;
external 'MediaInfo{#ext}Count_Get files@MediaInfo.Dll stdcall';

R.i.m.s.k.y.
22-12-2012, 13:49
Gnom_aka_Lexander, а где путь до файла? можно более подробный пример для файла C:\Avi.avi и вывод в MSGbox параметров файла

Gnom_aka_Lexander
22-12-2012, 13:59
MediaInfo_New - создает скажем так, сессию чтения медиапараметров.
MediaInfo_Delete - параметр - дескриптор полученый при вызове MediaInfo_New. удаляет сессию получения параметров.

MediaInfo_Open - первый параметр - дескриптор сессии, второй - путь к файлу. открывает подсессию для текущей сессии.
MediaInfo_Close закрывает текущую подсессию.
MediaInfo_Inform - первый параметр - дескриптор либо общей сессии, либо подсессии, получаемой из MediaInfo_Open, второй параметр - nil. возвращает строку информации.
в общем, все это по наитию, аналогично ковырять дальше, будет время - займусь сам.

smile7
23-12-2012, 13:23
Подскажите пожалуйста.
Как удалить окошко создания ярлыков (SelectProgramGroupPage), чтоб я мог сразу после нажатия кнопки Далее с окна выбора компонентов приступить к установке?
И как заставить секцию [INI] обходить атрибут "только для чтения" редактируемого файла (win7, файлы в {userdocs})

DEZMONDS
23-12-2012, 13:24
DestDir:. »
я так понимаю это создает файл в прямую директорию "C:\ProgramData"

а как сделать что бы файл создавался не прямо в эту директорию "C:\ProgramData" а еще создавал папку и туда копировался вот такой путь надо сделать : "C:\ProgramData\Unity\Unity_v4.x.ulf"

я так понял нужно сделать Source: E:\Unity_4.0.7f\Unity\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE};

правильно?

smile7
23-12-2012, 13:52
Подскажите пожалуйста.
Как удалить окошко создания ярлыков (SelectProgramGroupPage), чтоб я мог сразу после нажатия кнопки Далее с окна выбора компонентов приступить к установке?
И как заставить секцию [INI] обходить атрибут "только для чтения" редактируемого файла (win7, файлы в {userdocs})




© OSzone.net 2001-2012