PDA

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


Страниц : 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Johny777
20-07-2013, 12:42
R.i.m.s.k.y.,
я наверное что-то не так делаю, »
Вот чисто настройка привилегии:

#define A = (Defined UNICODE) ? "W" : "A"

const
TOKEN_QUERY = $8;
TOKEN_ADJUST_PRIVILEGES = $20;
SE_PRIVILEGE_ENABLED = $2;
////////////////////////////////////////////////
SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
SE_TCB_NAME = 'SeTcbPrivilege';
SE_SECURITY_NAME = 'SeSecurityPrivilege';
SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
SE_BACKUP_NAME = 'SeBackupPrivilege';
SE_RESTORE_NAME = 'SeRestorePrivilege';
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
SE_DEBUG_NAME = 'SeDebugPrivilege';
SE_AUDIT_NAME = 'SeAuditPrivilege';
SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
SE_UNDOCK_NAME = 'SeUndockPrivilege';
SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';
SE_IMPERSONATE_NAME = 'SeImpersonatePrivilege';
SE_CREATE_GLOBAL_NAME = 'SeCreateGlobalPrivilege';


type
LUID = record
LowPart: DWORD;
HighPart: Longint;
end;

LUID_AND_ATTRIBUTES = record
Luid: LUID;
Attributes: DWORD;
end;

TOKEN_PRIVILEGES = record
PrivilegeCount: DWORD;
Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';


function AdjustSelfProcessPrivileges(const PrivilegeName: String; const Enable: Boolean): Boolean;
var
tkp: TOKEN_PRIVILEGES;
hToken: THandle;
ret: Longint;
begin
// open process token adjust privileges
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
try
// Get the locally unique identifier (LUID) .
if LookupPrivilegeValue('', PChar(PrivilegeName), tkp.Privileges[0].Luid) then
begin
// fill token privileges struct
tkp.PrivilegeCount := 1; // one privilege to set
if Enable then
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else
tkp.Privileges[0].Attributes := 0;
// enable or disable the privilege
Result := AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
//if not Result then ShowMessage(SysErrorMessage(GetLastError));
end;
finally
CloseHandle(hToken);
end;
end;





/////////////////////////////
procedure InitializeWizard();
begin
if AdjustSelfProcessPrivileges(SE_DEBUG_NAME, True) then
try
MsgBox('Privilege Ajusted', mbInformation, MB_OK);
MsgBox('Do something', mbInformation, MB_OK);
finally
if AdjustSelfProcessPrivileges(SE_DEBUG_NAME, False) then MsgBox('Privilege Not Ajusted', mbInformation, MB_OK);
end

else MsgBox('Error', mbInformation, MB_OK);
end;


Какая из них тебе нужна не заню
Предполагаю - для каждого действия с твоей стороны нужна своя привилегия, а не одна на все!
Если используешь несколько подряд. Не забывай удалять старую (при помощи булев аргумента Enable) перед настройкой новой

UPD:
Кажись это всё-таки то, что тебе нужно. Вот статья http://www.rsdn.ru/article/baseserv/privileges.xml
там написано: " Учетные записи пользователей и групп являются доверенными объектами системы. Доверенные объекты – это сущности, которым может быть предоставлен или отклонен доступ к защищаемым объектам или ресурсам системы. Привилегии – это права доверенного объекта на совершение каких-либо действий по отношению ко всей системе."

R.i.m.s.k.y.
20-07-2013, 14:04
Johny777, крокодил не растет, регистрация валится с ошибкой 0х05
if AdjustSelfProcessPrivileges(SE_BACKUP_NAME, True) then //SE_TCB_NAME
try
MsgBox('Privilege Ajusted', mbInformation, MB_OK);
MsgBox('Do something', mbInformation, MB_OK);
RegisterServer(true, 'c:\Program Files (x86)\LAV\LAVVideo.ax', False);
finally
// if AdjustSelfProcessPrivileges(SE_DEBUG_NAME, False) then MsgBox('Privilege Not Ajusted', mbInformation, MB_OK);
end
else MsgBox('Error', mbInformation, MB_OK);

Johny777
20-07-2013, 14:35
регистрация валится с ошибкой 0х05 »
Текст ошибки можно получить так: MsgBox(SysErrorMessage($05), mbError, MB_OK); // 0x05 = $05

// MsgBox( SysErrorMessage(DLLGetLastError), mbError, MB_OK ); можно вызывать после каждой функции если она не отработала

""Отказано в доступе"". Значит у тебя нет привилегии/права делать это. Пробуй другие привилегии, пока не получится. Метод проб и ошибок - тоже метод :) И какое отношени имеет "Резервное копирование" к регистрации?

R.i.m.s.k.y.
20-07-2013, 17:14
Johny777, я знаю что 0х05 "ты не лев, недостаточно прав"
SE_TCB_NAME - тоже самое

такой еще вопрос знатокам - RunAsOriginalUser должен чье имя возвращать? originalUser или админа введшего пароль?

[Setup]
PrivilegesRequired=admin

procedure InitializeWizard();
var ResultCode : integer;
begin
ExecAsOriginalUser('cmd.exe', '/c echo > c:\1\1.txt %username%', ExpandConstant('{sys}'), SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;
инсталл запускается двойным кликом (не ПКМ - запуск от...), UAC спрашивает логин/пасс админа, и в c:\1\1.txt появляется имя одмина, хотя КМК там должно быть имя User'а тк он вошел в систему

Mat_y
20-07-2013, 22:24
Ребят, какой код надо написать, чтобы Inno понял, что на этой форме должен быть выбор компонентов?

R.i.m.s.k.y.
20-07-2013, 22:37
Mat_y, а стандартый [Components] чем не устраивает?

saurn
20-07-2013, 22:52
UAC спрашивает логин/пасс админа, и в c:\1\1.txt появляется имя одмина, хотя КМК там должно быть имя User'а тк он вошел в систему »
А разве в этом случае установка идет уже не под админом?
[Setup] PrivilegesRequired=admin »
Указывает, что инсталу для работы нужны повышеные полномочия. Но лишь указывает. При запуске винда видит, что инсталу нужно повышение полномочий, что она и делает, автоматически запуская от имена админа. Так что в данном случае дальнейшее RunAsOriginalUser будет уже админ. Или не? В этих учетных записях тёмный лес.
Ребят, какой код надо написать, чтобы Inno понял, что на этой форме должен быть выбор компонентов? »
Для сего действа есть секция [Components]
[Components]
Name: a; Description: Компонент 1; Types: full;
Name: b; Description: Компонент 2; Types: custom;

Mat_y
20-07-2013, 23:44
Mat_y, а стандартый [Components] чем не устраивает?
Не ребят, Вы меня не поняли... это все логично и понятно... но вот есть окна в установщике... приветствие, выбор директории установки, далее обычно идет выбор компонентов установки, и потом уже окно с ходом установки. Я использовал готовый скрипт и модифицировал его, но там нету окна с выбором компонентов... мне удалось добавить недостающее окно между выбором директории и установкой, но вот как сказать в CODE установщику, что это именно нужное для компонентов окно и как разместить там само поле с выбором программ, я не догоняю.

Вот окно приветствия:
http://s48.radikal.ru/i121/1201/5b/6a9ff0a9b8b0t.jpg (http://radikal.ru/fp/ebbaafe83ea44934b94f13043ed6590e)
Вот выбор директории:
http://s018.radikal.ru/i514/1201/fb/30d298324ba8t.jpg (http://radikal.ru/fp/5722cb9ce29f4d4fb2c7df05d1c924a6)
И установка:
http://s018.radikal.ru/i514/1201/b9/ab5ceb664266t.jpg (http://radikal.ru/fp/eb8aa7b624da453086ab4f14b054f7f9)

Я продублировал окно с выбором директории... изменил все переменные, убрал лишнее... а вот как туда вставить поле с выбором компонентов... сижу, второй день туплю.


ВОТ пример создания старницы выбора директории:

1) Создаются кнопки, выбор директории, назад, далее:
procedure DirBrowseBtnClick(h:HWND);
begin
WizardForm.DirBrowseButton.OnClick(WizardForm.DirBrowseButton);
AppLabel.Caption:=WizardForm.DirEdit.Text;
AppLabel2.Caption:=WizardForm.DirEdit.Text;
end;

procedure BackBtnClick(h:HWND);
begin
WizardForm.BackButton.OnClick(WizardForm.BackButton);
end;

procedure OKBtnClick(h:HWND);
begin
WizardForm.NextButton.OnClick(WizardForm.NextButton);
begin HideWelcomePage; HideSelectDirPage; ShowSelectComponentsPage;
end;
end;

2) Добавляется видео: (CreateSelectDirPage будет относится ко всему ниже... просто разобью на куски код)
procedure CreateSelectDirPage;
begin
if CanUseXvid then begin
vPanel2:=TPanel.Create(WizardForm);
with vPanel2 do begin
Visible:=False;
Parent:=WizardForm;
SetBounds(32,32,704,272);
end;
mciSendString('open '+ExpandConstant('{tmp}\vid_instdir.avi')+' alias sdVideo parent '+IntToStr(vPanel2.Handle)+' style child','',0,0);
mciSendString('put sdVideo window at 0 0 704 272','',0,0);
end;

3) Добавляем фоновую картинку, которая будет рамкой окна и в него вписываем путь установки:
BkgImg2:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\pbbkg.png'),28,347,0,0,False,True);

AppLabel2:=TLabel.Create(WizardForm);
with AppLabel2 do begin
Parent:=WizardForm;
Transparent:=True;
Caption:=WizardForm.DirEdit.Text;
with Font do begin
Name:=FontName;
Size:=11;
Color:=clBlack;
end;
Left:=59;
Top:=364;
end;
AppLabel:=TLabel.Create(WizardForm);
with AppLabel do begin
Parent:=WizardForm;
Transparent:=True;
Caption:=WizardForm.DirEdit.Text;
with Font do begin
Name:=FontName;
Size:=11;
Color:=$e5e5e5;
end;
Left:=57;
Top:=362;
end;

Ну и так далее...
А вот как сделать подобное для окна выбора компонентов?

R.i.m.s.k.y.
21-07-2013, 00:01
А разве в этом случае установка идет уже не под админом? »
в том то и да что RunAsOriginalUser должна возвращать (и запускать) под пользователем, вошедшим в систему
Указывает, что инсталу для работы нужны повышеные полномочия. Но лишь указывает. При запуске винда видит, что инсталу нужно повышение полномочий, что она и делает, автоматически запуская от имена админа. Так что в данном случае дальнейшее RunAsOriginalUser будет уже админ. Или не? В этих учетных записях тёмный лес. »
нет, при включенном UAC установщик скажет винде "мне нужны одминские права", UAC выдаст окно на логин/пасс одмина, и установщик продолжит от одмина, но фишка OriginalUser как раз в том чтобы поставить пользователю, в сессии которого запустили установщик, а не от которого запустили его

Johny777
21-07-2013, 18:45
Mat_y, В данном скрипте окна "создаются" процедурами. Дело в том, что стандартный TNoteBook - древний предок TPageControl здесь скрыт, и есть только сама форма TWizardForm и в педелах клиентской области в зависимости от индекса текущей страницы становятся видимыми/невидимыми соответствующие элементы интефейса. Всё это наглядно видно в procedure CurPageChanged(CurPageID: Integer);
основного скрипта. Для того чтобы добавить ещё одну страницу между стр. выбора директории и стр. установки необходимо удалить директиву DisableReadyPage=yes из раздела [Setup]. Список страниц такой:

const
wpWelcome = 1;
wpLicense = 2;
wpPassword = 3;
wpInfoBefore = 4;
wpUserInfo = 5;
wpSelectDir = 6;
wpSelectComponents = 7;
wpSelectProgramGroup = 8;
wpSelectTasks = 9;
wpReady = 10;
wpPreparing = 11;
wpInstalling = 12;
wpInfoAfter = 13;
wpFinished = 14;

Те страница номер 10 то что нужну
Далее в procedure CurPageChanged(CurPageID: Integer);
добавим следующее (красным выделил имплиментацию новой страницы)

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpWelcome: begin
if PrevCurPageID=wpSelectDir then HideSelectDirPage;
ShowWelcomePage;
end;
wpSelectDir: begin
if PrevCurPageID=wpWelcome then HideWelcomePage;
ShowSelectDirPage;
end;

wpReady: begin
if PrevCurPageID=wpSelectDir then HideSelectDirPage;
ShowSelectComonentsPage;
end;

wpInstalling: begin
if PrevCurPageID=wpReady then HideSelectComonentsPage;
ShowInstallingPage;
end;
end;
end;

Надеюсь ты понимаешь весь принцип. Те для каждой страницы Действуют 3 процедуры:
CreateИмяСтраницы (где-то во внешних библиотеках при инициализации)
ShowИмяСтраницы
HideИмяСтраницы
Остаётся только описание тела процедур для твоей новой страницы, и оно такое же как и у других страниц, только с твоим содержимым на ней (видео, чекбоксы и пр.)

adelina.dragonborn@vk
21-07-2013, 23:35
Всем привет. Хочу добавить ярлык в обозреватель игр в Windows 7. Это уже, конечно, обсуждалось, однако, как бы я ни старался, не могу создать ярлык.

Делал по инструкции


#define GDFBinary "{app}\GDF.dll"

[Tasks]
Name: Gameux; Description: "Добавить ссылки в Game Explorer"; GroupDescription: "Game Explorer:"; MinVersion: ,6.0.6000;

[Files]
Source: include\GDF.dll; DestDir: {app};
Source: include\GameuxInstallHelper.dll; DestDir: {app}; Flags: overwritereadonly

[_Code]
type
TGUID = record D1: Cardinal; D2: Word; D3: Word; D4: Array [0..8] of Byte; end;

function AddToGameExplorer(BinaryPatch: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal; external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(BinaryPatch: String; var GUID: TGUID): Cardinal; external 'RetrieveGUIDForApplicationA@{app}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal; external 'RemoveFromGameExplorer@{app}\GameuxInstallHelper.dll stdcall uninstallonly';

var GUID: TGUID;
procedure CurStepChanged(CurStep: TSetupStep);
var GDFBinary: String;
begin
if (CurStep = ssPostInstall) and IsTaskSelected('Gameux') then
begin
GDFBinary:=ExpandConstant('{#GDFBinary}');
AddToGameExplorer(GDFBinary, ExpandConstant('{app}'), 3, GUID);
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var GDFBinary: String; GUID: TGUID;
begin
if (CurUninstallStep=usUninstall) then
begin
GDFBinary:=ExpandConstant('{#GDFBinary}');
RetrieveGUIDForApplication(GDFBinary, GUID);
RemoveFromGameExplorer(GUID);
UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll'));
end;
end;


Естественно, подправив. Однако, на этапе компилляции выскакивает ошибка Duplicate identifier 'TGUID'

Порывшись, узнал, что это из-за версии компиллятора. Чтобы не менять версию, закомменторовал строчку type TGUID = record D1: Cardinal; D2: Word; D3: Word; D4: Array [0..8] of Byte; end;

Может ли это являться причиной моих неудач?

Конечно, есть также вероятность, что я неправильно сконструировал GDF.dll

Инструкции нормальной таки не нашел. Если такая имеется, то подскажите, где ее брать...

adelina.dragonborn@vk
22-07-2013, 00:38
saurn, да, юникодавая. Но она поддерживает некоторые функции, т.ч. я не хотел бы отказываться от нее...

P.S. последняя поправка проблему не решает. Ошибка на строке TGUID = record
- Duplicate identifier 'TGUID'

adelina.dragonborn@vk
22-07-2013, 00:54
saurn, ох, ковыряю уже давно...Явно что-то там не так)

adelina.dragonborn@vk
22-07-2013, 01:17
saurn, спасибо, проверю!

saurn, не создается, зараза...

saurn
22-07-2013, 02:10
adelina.dragonborn@vk, а так:
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
#define GDFBinary "{app}\GDF.dll"

type
TGUID_ID = record
DATA1: Cardinal;
DATA2: Word;
DATA3: Word;
DATA4: Array [0..8] of Byte;
end;


function AddToGameExplorer(BinaryPatch: String; Path: String; InstallType: Integer; var GUID: TGUID_ID): Cardinal; external 'AddToGameExplorer{#A}@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(BinaryPatch: String; var GUID: TGUID_ID): Cardinal; external 'RetrieveGUIDForApplication{#A}@{app}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID_ID): Cardinal; external 'RemoveFromGameExplorer@{app}\GameuxInstallHelper.dll stdcall uninstallonly';


var
GUID: TGUID_ID;


procedure CurStepChanged(CurStep: TSetupStep);
var
GDFBinary: String;
begin
case CurStep of
ssPostInstall:
begin
if isTaskSelected('Gameux') then
GDFBinary:=ExpandConstant('{#GDFBinary}');
AddToGameExplorer(GDFBinary, ExpandConstant('{app}'), 3, GUID);
end;
end;
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
GDFBinary: String;
GUID: TGUID_ID;
begin
case CurUninstallStep of
usUninstall:
begin
GDFBinary:=ExpandConstant('{#GDFBinary}');
RetrieveGUIDForApplication(GDFBinary, GUID);
RemoveFromGameExplorer(GUID);
UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll'));
end;
end;
end;

mat_y@vk
22-07-2013, 08:54
добавим следующее (красным выделил имплиментацию новой страницы) »
Спасибо огромное, хотя это я и так понял... этот принцип... но загвоздка в том, что у нас появляется 2 "if PrevCurPageID=wpSelectDir" - первое IF и третье... и получается билиберда... я решил это следующим способом... я пришил эту функцию к Кнопке "Далее":
procedure OKBtnClick(h:HWND);
begin
WizardForm.NextButton.OnClick(WizardForm.NextButton);
begin HideWelcomePage; HideSelectDirPage; ShowSelectComponentsPage;
end;
end;


необходимо удалить директиву DisableReadyPage=yes из раздела [Setup] »
А причем тут ReadyPage? Мне же нужен wpSelectComponents = 7;
Объясните пожалуйста.

Это все (вышеописанное) я уже сделал... а как добавить то само поле с выбором компонентов... ему же надо задать координаты на форме и его размер... как его описать в скрипте?

nik1967
22-07-2013, 10:13
mat_y@vk,
[Setup]
AppName=Приложение
AppVerName=Приложение
DefaultDirName={pf}\123
OutputDir=.

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: Game; Description: Game_Component;
Name: Game\Lokal; Description: Game_Local_Component; Flags: exclusive; Types: full;
Name: Game\Full; Description: Game_Full_Component; Flags: exclusive;

[_Code]
var
NewForm: TWizardPage;

procedure InitializeWizard();
begin
NewForm:= CreateCustomPage(wpSelectComponents, 'Выбор компонентов', 'Что нибудь ещё');
with WizardForm.ComponentsList do begin
Parent:= NewForm.Surface;
end;
end;
А, не. Ты же делаешь на ботве. Советую скачать Need for Speed™ Undercover.iss v 2.4c [Final] от YURSHAT (http://forum.ru-board.com/topic.cgi?forum=5&topic=36421&start=0&limit=1&m=6#1) модернизированный мной, и посмотреть, как там реализованы компоненты.

procedure OKBtnClick(h:HWND);
begin
WizardForm.NextButton.OnClick(WizardForm.NextButton);
begin HideWelcomePage; HideSelectDirPage; ShowSelectComponentsPage;
end;
end;

adelina.dragonborn@vk
22-07-2013, 11:12
saurn, гениально! It Works! Сам бы никогда не додумался)

Теперь другая проблема...Resource Hacker не слушается. Может есть другой аналог-заменитель? Restorator боюсь ставить - один раз он уже сыграл со мной злую шутку.

saurn
22-07-2013, 12:06
adelina.dragonborn@vk, оффтоп, ну да ладно...
О рестораторе плохого не скажу, пользуюсь только им уже невесть сколько лет. Есть еще PE Explorer. Из бесплатных, пожалуй, только Resource Hacker, - а в чем проблема, он тоже справится с этой задачей.

adelina.dragonborn@vk
22-07-2013, 12:20
saurn, проблемы:
1) отсутствует оценка игры (хотя в xml-е присутствуют оценки - <Rating ratingSystemID="{768BD93D-63BE-46A9-8994-0B53C4B5248F}" ratingID="{78D8CC82-372F-44e4-B70C-8944DB7BCC24}">
2) Издатель и разработчик присутствуют, однако должна быть ссылка на них - ее нету (хотя ссылка прописана в xml-е - <Publisher URI="http://www.activision.com">Activision, Inc.</Publisher>
3) В GDF-Maker'e есть опция - Thumbnail (логотип игры). Как его запихать в dll? Action -> Add new resource -> выбираю изображение -> а дальше куда его? (Type, name в частности) - Решено.
4) Задана папка сейвов (Saved Game Folder), где она должна отображаться в проводнике игр?

P.S. Если есть xml - был бы благодарен, если поделитесь :)




© OSzone.net 2001-2012