1 (изменено: Indomito, 2017-01-06 16:06:50)

Тема: AHK: Пакетная компиляция, ошибка c INI или с ICO файлами

Приветствую.

Написал я скрипт, что бы в INI-файле были все параметры необходимые для компиляции.

Вот пример файла - AsteriosGames.ini.

;Определения для компиляции AsteriosGames
[Compile]
keyIN=""C:\AHK\AsteriosGames\AsteriosGames.ahk""
keyOUT=""F:\GameS\LAII HF - Asterios\AsteriosGames.exe""
keyICON=""С:\AHK Compiler\ICO\LA2S2.ico""
keyBIN=""Unicode 64-bit.bin""
keyMPRESS=""1""

И сам скрипт.

+ Compile.ahk
;Тут только OK
  сMsgBoxInfo_Ok          :=0+8192+64 ;only an OK button + Task Modal + Icon Asterisk(info)
  сMsgBoxError_Ok         :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)  
   
  FileINI :=  fnCountArgs()
  Secion  :=  "Compile"
  
  IniRead keyIN, %FileINI%, %Secion%, keyIN
  if (keyIN="ERROR")
      {
        MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
              ,`n`n  Ошибка в секции %Secion% в переменной keyIN`n`n Выход из программы.
              ,30      
        Goto lEnd_AHK_Compile
      }
  
  IniRead keyOUT, %FileINI%, %Secion%, keyOUT
  if (keyOUT="ERROR")
      {
        MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
              ,`n`n  Ошибка в секции %Secion% в переменной keyOUT`n`n Выход из программы.
              ,30      
        Goto lEnd_AHK_Compile
      }
  
  IniRead keyICON, %FileINI%, %Secion%, keyICON
  if (keyICON="ERROR")
      {
        MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
              ,`n`n  Ошибка в секции %Secion% в переменной keyICON`n`n Выход из программы.
              ,30      
        Goto lEnd_AHK_Compile
      }  
  
  IniRead keyBIN, %FileINI%, %Secion%, keyBIN
  if (keyBIN="ERROR")
      {
        MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
              ,`n`n  Ошибка в секции %Secion% в переменной keyBIN`n`n Выход из программы.
              ,30      
        Goto lEnd_AHK_Compile
      }  
  
  IniRead keyMPRESS, %FileINI%, %Secion%, keyMPRESS
  if (keyMPRESS="ERROR")
      {
        MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
              ,`n`n  Ошибка в секции %Secion% в переменной keyMPRESS`n`n Выход из программы.
              ,30      
        Goto lEnd_AHK_Compile
      }

  vTarget := "Ahk2Exe.exe /in " keyIN " /out " keyOUT " /icon " keyICON " /bin " keyBIN " /mpress " keyMPRESS
; Рабочая папка компилятора
  vWorkingDir := "C:\Program Files\AutoHotkey\Compiler\"
; Запуск компилятора
  Run, %vTarget% , %vWorkingDir%
; Успешная компиляция
  MsgBox % сMsgBoxInfo_Ok, Успешная компиляция
            ,`n`n  Компиляции скрипта завершена`n`n        DONE!   `n`n Выход из программы.
            ,7      
lEnd_AHK_Compile:
  ExitApp
  
fnCountArgs(){
global
	If %0% ; Выборка аргументов командной строки = только один аргумет
		{
			args := []
			vCountArgs := 0
			Loop %0%
				{
					args[A_Index] := %A_Index%
					vCountArgs++
				}
		}
	vIniFile := args[1]

  	If (vCountArgs < 1)
    {
      ;Не указан ini-файл, вызываем диалог выбора ini-файла
			vPrompt := "Выберите ini-файл для компиляции скрипта"
			FileSelectFile, vIniFile, 3, %A_WorkingDir%\INI, %vPrompt%, *.ini
      if (ErrorLevel = 1)
          {
            MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
            ,`n`n  Не указан ini-файл для компиляции скрипта`n Укажите ini-файл как параметр`n`n Выход из программы.
            ,30      
            ExitApp
          }	
		}
Return vIniFile
}

В результате Ahk2Exe.exe ругается, что не может изменить ICO-файл или ICO-файл не верного формата(перевод мой).

P.S. Могу дать скиншот, если нужно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Эл. почта: dysansven@gmail.com Skype: indomito_64
Правила - основные.

2

Re: AHK: Пакетная компиляция, ошибка c INI или с ICO файлами

Путаете буквы C и C.

3

Re: AHK: Пакетная компиляция, ошибка c INI или с ICO файлами

ypppu пишет:

Путаете буквы C и C.

Вы про оформление или про скрипт?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Эл. почта: dysansven@gmail.com Skype: indomito_64
Правила - основные.

4

Re: AHK: Пакетная компиляция, ошибка c INI или с ICO файлами

В скрипте буква диска оказалась кириллическая.

5

Re: AHK: Пакетная компиляция, ошибка c INI или с ICO файлами

ypppu Спасибо, стал искать все буквы C - она оказалась в пути, в Ini-files.
Да, уж такую ошибку тяжело отловить.

Спасибо за ответ, мой вопрос исчерпан.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Эл. почта: dysansven@gmail.com Skype: indomito_64
Правила - основные.

6 (изменено: Indomito, 2017-01-11 20:56:22)

Re: AHK: Пакетная компиляция, ошибка c INI или с ICO файлами

Всё сделал и убрал все возможные ошибки, которые мне в голову пришли.

+ Пример ini-file Compiler.ini
;Пример определения секции для компиляции
;Компиляция по умолчанию отсутствует, т.к. это излишне, просто вопользуйтесь Ahk2Exe.exe
[Main]
;Рабочая папка компилятора
WorkingDir=C:\Program Files\AutoHotkey\Compiler

;Компилятор
Compiler=C:\Program Files\AutoHotkey\Compiler\Ahk2Exe.exe

;Входной файл AHK-file
keyIN=C:\AHK\Comple\Compiler.ahk

;Выходная директория и выходной Exe-file
keyOUT=C:\AHK Compiler\AHK Compiler.exe

;Ico-file для выходного Exe-file
keyICON=C:\AHK Compiler\ICO\AHK Compiler.ico

;Base file BIN(AutoHotkeySC.bin/ANSI 32-bit.bin/Unicode 32-bit.bin/Unicode 64-bit.bin) для выходного Exe-file
keyBIN=Unicode 64-bit.bin

;Выходной Exe-file сжимать/не сжимать=1/0. Для сжатия нужна программа mpress.exe
keyMPRESS=1
+ Исходник Compiler.ahk
;Тут только OK
  сMsgBoxInfo_Ok          :=0+8192+64 ;only an OK button + Task Modal + Icon Asterisk(info)
  сMsgBoxError_Ok         :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)  
  сMsgBoxChoice_Ok        :=0+8192+48 ;only an OK button + Task Modal + Icon Exclamation
  vQuote  :=  """"

;Чтение и проверка Ini-file  
  FileINI :=  fnGetFileINI()
  Secion  :=  "Main"
  ChkDir  :=  1
  ChkFile :=  2
  Trip    := -1

;Рабочая папка компилятора
  WorkingDir := fnIniRead(FileINI, Secion, "WorkingDir", ChkDir)
  If (WorkingDir = Trip)
      Goto lEnd_AHK_Compile
  WorkingDir  :=  WorkingDir "\"
;Компилятор
  Compiler := fnIniRead(FileINI, Secion, "Compiler", ChkFile)
  If (Compiler = Trip)
      Goto lEnd_AHK_Compile
;Входной файл AHK-file
  keyIN  := fnIniRead(FileINI, Secion, "keyIN", ChkFile)
  If (keyIN = Trip)
      Goto lEnd_AHK_Compile
  keyIN  := vQuote keyIN vQuote
;Выходная директория и файл
  keyOUT    :=  fnIniRead(FileINI, Secion, "keyOUT")
  If (keyOUT = Trip)
      Goto lEnd_AHK_Compile
  Needle    :=  "\"
  vPos      :=  InStr(keyOUT, Needle , , 0)
  VarDir    :=  SubStr(keyOUT, 1 , vPos-1)
  VarFile   :=  SubStr(keyOUT, vPos+1)
  NameProc  :=  VarFile
  keyOUT    := vQuote keyOUT vQuote
  if (!InStr(FileExist(VarDir), "D"))
       {
        MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
                ,`n`nОшибка в секции %Secion% в переменной keyOUT`n`n Пути %VarDir% не существует`n`nВыход из программы.
                ,15
        Goto lEnd_AHK_Compile
       }
  
;Ico-file для выходного Exe-file
  keyICON :=  fnIniRead(FileINI, Secion, "keyICON", ChkFile)
  If (keyICON = Trip)
      Goto lEnd_AHK_Compile
  keyICON  := vQuote keyICON vQuote
;Base file BIN(AutoHotkeySC.bin/ANSI 32-bit.bin/Unicode 32-bit.bin/Unicode 64-bit.bin) для выходного Exe-file  
  keyBIN :=  fnIniRead(FileINI, Secion, "keyBIN") 
  If (keyBIN = Trip)
      Goto lEnd_AHK_Compile
  keyBIN  := vQuote keyBIN vQuote
;Выходной Exe-file сжимать/не сжимать=1/0 нужна программа mpress.exe
  keyMPRESS :=  fnIniRead(FileINI, Secion, "keyMPRESS") 
  If (keyBIN = Trip)
      Goto lEnd_AHK_Compile


  If (fnCheckExistProc(NameProc))
      {       
        MsgBox % сMsgBoxChoice_Ok, Ошибка компиляции
              ,`n`nСледует завершить процесс %NameProc%`n`n Заршите процесс %NameProc%!`n`nВыход из программы
              ,10
       Goto lEnd_AHK_Compile  
      } 
  
  Target := Compiler " /in " keyIN " /out " keyOUT " /icon " keyICON " /bin " keyBIN " /mpress " keyMPRESS
  Run, %Target% , %WorkingDir%
; Успешная компиляция
  MsgBox % сMsgBoxInfo_Ok, Успешная компиляция
            ,`n`n  Компиляции скрипта завершена`n`n        DONE!   `n`n Выход из программы.
            ,3     
lEnd_AHK_Compile:
  ExitApp

fnIniRead(FilenameINI, SectionINI := "", KeyINI := "", CheckDirOrFile := False)
{
Global   ;----------------------------
  IniRead, VarKey, %FilenameINI%, % SectionINI, % KeyINI
  if (VarKey="ERROR")
      {
        MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
              ,`n`nОшибка в секции %SectionINI% в переменной %KeyINI%`n`nОпределена не верно`n`nВыход из программы
              ,15
        Return -1
      }
   If (CheckDirOrFile = False) ;Ничего не проверяем
          Return VarKey

   If (CheckDirOrFile = 1) ;Проверяем путь, т.е. директорию
       {
        if (!InStr(FileExist(VarKey), "D"))
          {
            MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
                    ,`n`nОшибка в секции %SectionINI% в переменной %KeyINI%`n`nПути %VarKey% не существует`n`nВыход из программы.
                    ,15      
            Return -1
          }
       }        

   If (CheckDirOrFile = 2) ;Проверяем наличие файла в полном пути
       {
        if (!FileExist(VarKey))
          {
            MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
                    ,`n`nОшибка в секции %SectionINI% в переменной %KeyINI%`n`nФайла %VarKey% не существует`n`nВыход из программы.
                    ,15      
            Return -1
          }
       }

Return VarKey
}

fnGetFileINI(){
global
	If %0% ; Выборка аргументов командной строки = только один аргумет
		{
			args := []
			vCountArgs := 0
			Loop %0%
				{
					args[A_Index] := %A_Index%
					vCountArgs++
				}
		}
	vIniFile := args[1]

  	If (vCountArgs < 1)
    {
      ;Не указан ini-файл, вызываем диалог выбора ini-файла
			vPrompt := "Выберите ini-файл для компиляции скрипта"
      vIniFile  := ;
      vOptions  := 1+2
      vIniDir   := "*C:\AHK Compiler\INI\"
      vFilter   := "*.ini"
			FileSelectFile, vIniFile, %vOptions%, %vIniDir%, %vPrompt%, %vFilter%
      if (ErrorLevel = 1)
          {
            MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
            ,`n`n  Не указан ini-файл для компиляции скрипта`n Укажите ini-файл как параметр`n`n Выход из программы.
            ,30      
            ExitApp
          }	
		}
Return vIniFile
}

;---------------------------Функция проверки существования процесса-----------------------------
; Вход (имя процесса полное, т.е. exe-файл)
; Ответ True/False = процесс работает(существует)/не работает(не существует)
fnCheckExistProc(ByRef vPIDName)
{
  Thread, NoTimers
    ; Проверяем существование процесса  vPIDName
    Process, Exist, %vPIDName%
    if (ErrorLevel = 0) 
          vRet  := False  ; Программа и/или скрипт не запущен
    Else
          vRet  := True    
    Thread, NoTimers, false
  Return vRet ; Выходим с ответом
}

Может, кому и пригодиться.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Эл. почта: dysansven@gmail.com Skype: indomito_64
Правила - основные.