Вопрос Как реализовать копирование файлов + правка *.ini по железу?

Infest

Новичок
Доброго времени суток!

Хотелось бы обратиться с парой вопросов к сидящим тут спецам.

Ребят, возникла необходимость добавить функцию, которая на странице выбора директории игры создаёт ещё одно поле с выбором директории, но только не для установки, а для копирования (а также автоматического переименовывание некоторых файлов) из одной папки, в папку, куда будет ставиться проект. Каким образом можно реализовать данную фичу?

И второй вопрос. Как реализовать скрипт, отвечающий за редактирование некоторых значений в *.ini файле, исходя из различных конфигураций железа пользователя (в данном случае кол-во оперативной памяти и кол-во ядер процессора).
Например: Section: CORE; Key: NumProcessorCores; //И если у пользователя на борту 4 ядра, то...// String: 4;

Заранее спасибо и с уважением :)
 

Shegorat

Lord of Madness
Администратор
И второй вопрос. Как реализовать скрипт, отвечающий за редактирование некоторых значений в *.ini файле, исходя из различных конфигураций железа пользователя (в данном случае кол-во оперативной памяти и кол-во ядер процессора).
Например: Section: CORE; Key: NumProcessorCores; //И если у пользователя на борту 4 ядра, то...// String: 4;
Как-то так
Код:
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp

[code]

#define MakeVer(int v1, int v2, int v3) ((v1 << 24) + (v2 << 16) + (v3 << 8))

type
  TSystemInfo = record
    wProcessorArchitecture: Word;
    wReserved: Word;
    dwPageSize: DWORD;
    lpMinimumApplicationAddress: Integer;
    lpMaximumApplicationAddress: Integer;
    dwActiveProcessorMask: DWORD;
    dwNumberOfProcessors: DWORD;
    dwProcessorType: DWORD;
    dwAllocationGranularity: DWORD;
    wProcessorLevel: Integer;
    wProcessorRevision: Word;
  end;
#if ((Ver >= MakeVer(5, 5, 3)) && defined(UNICODE))
  TMemoryStatusEx = record
    dwLength: Longword;
    dwMemoryLoad: Longword;
    ullTotalPhys: Int64;
    ullAvailPhys: Int64;
    ullTotalPageFile: Int64;
    ullAvailPageFile: Int64;
    ullTotalVirtual: Int64;
    ullAvailVirtual: Int64;
    ullAvailExtendedVirtual: Int64;
  end;
#else
  TMemoryStatusEx = record
    dwLength: Longword;
    dwMemoryLoad: Longword;
    ullTotalPhysLo: Longword;
    ullTotalPhysHi: Longword;
    ullAvailPhysLo: Longword;
    ullAvailPhysHi: Longword;
    ullTotalPageFileLo: Longword;
    ullTotalPageFileHi: Longword;
    ullAvailPageFileLo: Longword;
    ullAvailPageFileHi: Longword;
    ullTotalVirtualLo: Longword;
    ullTotalVirtualHi: Longword;
    ullAvailVirtualLo: Longword;
    ullAvailVirtualHi: Longword;
    ullAvailExtendedVirtualLo: Longword;
    ullAvailExtendedVirtualHi: Longword;
  end;
#endif

procedure GetSystemInfo(var lpSystemInfo: TSystemInfo); external 'GetSystemInfo@kernel32.dll stdcall';
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean; external 'GlobalMemoryStatusEx@kernel32.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
var
  SI: TSystemInfo;
  MS: TMemoryStatusEx;
  mem: Extended;
begin
  if (CurStep = ssPostInstall) then begin
    MS.dwLength:= sizeof(MS);
    GetSystemInfo(SI);
    GlobalMemoryStatusEx(MS);
    #if ((Ver >= MakeVer(5, 5, 3)) && defined(UNICODE))
      mem:= MS.ullTotalPhys;
    #else
      mem:= (MS.ullTotalPhysHi shl 32) + MS.ullTotalPhysLo;
    #endif
    SetIniString('CORE', 'NumProcessorCores', IntToStr(SI.dwNumberOfProcessors), ExpandConstant('{app}\Config.ini'));
    SetIniString('CORE', 'TotalMemory', Format('%.0f', [mem/1024/1024]), ExpandConstant('{app}\Config.ini'));
  end;
end;
 

Infest

Новичок
Shegorat, большое спасибо, однако после вставки кода в скрипт, компиляции и попытке протестировать инсталлятор, выскакивает ошибка, мол, программа не может скопировать n-файл в папку c:\windows\system32 (хрен знает почему он туда ставит), ссылаясь что не может создать путь, т.к. в пути есть недопустимые символы.

Это выглядит примерно так:
Код:
Ошибка
С:\Windows\system32\'C:\Program Files (x86)\MyProg\MyProg.exe

Произошла ошибка при попытке создания файла в папке назначения:
Невозможно создать папку "С:\Windows\system32\'C:".

Ошибка 132: Синтаксическая ошибка в имени файла, имени папки или метки тома.

Нажмите повтор и блаблабла....
При этом в самом копиляторе после закрытия выскакивает ошибка "Строка 73: Type Mismatch"

И ссылается на ошибку в следующей строке:
Код:
mem:= (MS.ullTotalPhysHi shl 32) + MS.ullTotalPhysLo;
Как я понял, тут либо не хватает какого-то модуля, либо библиотеки. Так, не?
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
Infest
По первой ошибке - моя тут не при чем. Скрипт в систему не лезет.
По второй ошибке - версия Inno Setup какая? Я тестировал на 5.3.9 - 5.5.1. Не на всех конечно из диапазона, но все же.
 

Infest

Новичок
По первой ошибке - моя тут не при чем. Скрипт в систему не лезет.
Будем разбираться, в чём косяк.

По второй ошибке - версия Inno Setup какая? Я тестировал на 5.3.9 - 5.5.1. Не на всех конечно из диапазона, но все же.
5.5.1 от ResTools

*update1*
Походу после удаление официальной версии IS что-то сломалось, теперь даже при простецких скриптах, аля [Setup] + [Files] инсталлятор, невзирая на указанный маршрут установки, пытается спихнуть его в С:\Windows\system32\. Также ругается на другие скрипты, которые в оффициальной версии работали без проблем. Хз как оперативно лечить, попробую всё снести и заново установить, если не поможет, попробую покопаться в реестре.

*update2*
На резервном компе глянул скрипт, нашёл ошибку, исправил. Теперь скрипт работает на "Ура"! Осталось решить косяк с компилятором на основном компе. И найти способ реализовать пункт 1. :)

*update3*
Всё таки косяк есть. Вместо количества ядер процессора скрипт вписывает в *.ini количество его потоков выполнения (или кэш-память процессора, хз).

*update4*
Кажись добрался до истины. Дело в архитектуре процессора. Т.к. в проце задействована технология MultiCPU Hyper-Threading, то вместо 4 реальных ядер скрипт видит эмулируемые восемь, как собственно и описывалось выше, относительно восьми потоков выполнения операций процессора. Вот сижу, гадаю, критично ли это?
 
Последнее редактирование:

Infest

Новичок
Вообщем решил проблему с IS. Была какая то фигня с реестром. Всё подчистую вычистил, заново поставил IS от ResTools. Всё работает.
Отдельное спасибо товарищу Shegorat, за скрипт автоопределения железа и правок ini.

Насчёт первого пункта.
Вообщем попытаюсь перефразировать свой вопрос.
Суть установки такова: имеется проект, но для его работы нужны файлы из другого проекта, чтобы не нарушать авторские права и не копировать файлы чужого проекта в свой инсталлятор (да и условия мне были поставлены такие, чтобы реализовать копирование файлов из другого проекта, а не тупо пихать их в свой инсталлятор).

Вообщем это выглядит примерно так:
Код:
На странице SelectDirPage
Основной путь, тобишь:
dir1: {pf}\мой проект
Директория, из которой будут скопированы файлы, тобишь.
dir2: {pf}\другой проект, из которого будут копироваться файлы в dir1 и некоторые из них (т.е. не все) переименовываться другим именем
Есть у кого какие идеи? Может кому нибудь встречались подобные инсталляторы?

Уже пятые сутки бьюсь в истерике, как реализовать это, но всё как-то не получается, ибо мои познания в delphi как у школьника первоклассника, который взял в руки учебник по мат. анализу

А тем временем сроки горят


зы: в IS сделал примерную визуальную заготовку, как эта проклятая хрень должна выглядеть:
 
Последнее редактирование:

Krinkels

Он где то тут
Администратор
Infest, Ну либа для копирования файлов у меня есть, вот только немного не дописана она.
 

Infest

Новичок
Infest, Ну либа для копирования файлов у меня есть, вот только немного не дописана она.
А вообще рабочая, т.е. свои функции выполнить может?

А вообще как-то давно встречал инсталляторы с подобной функцией, правда из памяти намертво вышибло, в каких. :(
 

Krinkels

Он где то тут
Администратор
Такс, вроде как подправил. В архиве скрипт для теста.
function isCopyFile( callback: longword; PathOut, PathIn: String; bInnerFolders: bool ): integer; .....
PathOut - Откуда
PathIn - Куда
bInnerFolders - Копировать ли подпапки
 

Вложения

Infest

Новичок
Krinkels, низкий поклон до земли :)

Вот только что-то не хотит у меня скрипт как положено работать, задаю копируемый файл и путь, куда он должен быть скопирован. Реакции ноль :scratchhead:
 

Krinkels

Он где то тут
Администратор
mCopyFiles( 'C:\NVIDIA\*', 'C:\123' );
В первом параметре после последнего слеша нужно задавать маску файлов. Если просто звездочка то скопируется все.
 

Infest

Новичок
mCopyFiles( 'C:\NVIDIA\*', 'C:\123' );
В первом параметре после последнего слеша нужно задавать маску файлов. Если просто звездочка то скопируется все.
Это то понятно, вот только даже со звёздочкой ничего не копируется, не говоря уже о маске.
 

Infest

Новичок
Попробуй эту версию
Аналогичная ситуация. Конечная папка, куда должны были скопироваться файлы и подпапки из 'C:\NVIDIA\*' (тоже взял в качестве примера для копирования), пуста =((

А у вас эта функция работает? Может быть я что-то не то делаю?

зы: или может быть что-то со скриптом неладно?
 

YURSHAT

Тех. админ
Администратор
Скомпилил дефолтный пример - все работает
Инка 5.5.1.ee2 (u) (build 121216)
 

Infest

Новичок
Скомпилил дефолтный пример - все работает
Инка 5.5.1.ee2 (u) (build 121216)
Значит походу у меня руки кривые, хотя почти такой же IS 5.5.1.ee2 (u) (от ResTools), только билд 121002.

Заменял только значения в mCopyFiles( 'C:\NVIDIA\*', 'C:\123' );, а потом и вовсе решил создать папки по примеру скрипта. Значит, наверное, косяк в IS. Будем разбираться.

зы: что-то мне не везёт в последнее время с компилятором. То один косяк, то другой :(
 

Infest

Новичок
Нужно скачать сборку отсюда, и радоваться жизни :)
Она и стоит у меня.
Поставил версию, как у товарища YURSHAT, ситуация не изменилась. Я честно говоря в ступоре. o_O

*добавлено*
Решил переустановить InnoUltra. В конце установки вылезла ошибка, что isscint.dll не найдена. Что это и с чем это едят? Гугл ничего внятного не дал.
Также во время компиляции любого проекта выскакивает ошибка.
Код:
Reading default messages from Default.isl
Oшибка компилятора!
File: C:\Program Files (x86)\Inno Setup 5\Default.isl Line 197: Message name "ErrorCloseApplications" in Default.isl is not recognized by this version of Inno Setup.
 
Последнее редактирование:

Krinkels

Он где то тут
Администратор
Ну что то неправильно встало, вот и не работает
 
Сверху