Une lecture passionnante : TSforge
L’explication est, certes, ardue techniquement mais passionnante

Bonne lecture
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
https://massgrave.dev/changelogMAS Changelog
3.0
The Forge Awakens
TSforge:
A new activation method named TSforge is added to MAS.
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
Code : Tout sélectionner
TWL2.3C6D64786E2430313D2D6162776F62707D2E6F69647166796473616D2133 36313F23777F646E69677F2562716774766F637F23777E21637B6162623F2F2A3 3707474786
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
Merci pour cette information et je confirme que Microsoft Activation Scripts (MAS) 3.0 traite "Microsoft 365".Joselito a écrit : ↑il y a 1 semaine @All,
Comme précisé d'ailleurs dans la documentation, TSforge ne permet pas d'activer "Microsoft 365".
L'application se retrouve transformée en version "Office 2016 Mondo", pré-version d'Office 2016 anciennement destinée aux "technicial professionals".
Pas de problème avec "Office 2024".
Code : Tout sélectionner
#NoTrayIcon
#Region
#AutoIt3Wrapper_Icon=heu_kms.ico
#AutoIt3Wrapper_Outfile=HEU_KMS_Activator_v50.0.0.exe
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Res_Comment=KMS/数字权利/KMS38/OEM激活
#AutoIt3Wrapper_Res_Description=HEU KMS Activator™
#AutoIt3Wrapper_Res_Fileversion=50.0.0.0
#AutoIt3Wrapper_Res_ProductVersion=50.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=知彼而知己
#AutoIt3Wrapper_Res_Language=2052
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#AutoIt3Wrapper_Res_Field=Productname|HEU KMS Activator
#AutoIt3Wrapper_Res_Field=CompanyName|知彼而知己
#AutoIt3Wrapper_Res_Field=OriginalFilename|HEU_KMS_Activator_v50.0.0
#AutoIt3Wrapper_Res_Field=InternalName|HEU_KMS_Activator_v50.0.0
#Tidy_Parameters=/sci 0
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
#Region
#EndRegion
INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Dir", @SCRIPTDIR)
INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Name", @SCRIPTNAME)
INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "UserAgreement", "UA", "NO")
GLOBAL CONST $OPT_COORDSRELATIVE = 0
GLOBAL CONST $OPT_COORDSABSOLUTE = 1
GLOBAL CONST $OPT_COORDSCLIENT = 2
GLOBAL CONST $OPT_ERRORSILENT = 0
GLOBAL CONST $OPT_ERRORFATAL = 1
GLOBAL CONST $OPT_CAPSNOSTORE = 0
GLOBAL CONST $OPT_CAPSSTORE = 1
GLOBAL CONST $OPT_MATCHSTART = 1
GLOBAL CONST $OPT_MATCHANY = 2
GLOBAL CONST $OPT_MATCHEXACT = 3
GLOBAL CONST $OPT_MATCHADVANCED = 4
GLOBAL CONST $CCS_TOP = 1
GLOBAL CONST $CCS_NOMOVEY = 2
GLOBAL CONST $CCS_BOTTOM = 3
GLOBAL CONST $CCS_NORESIZE = 4
GLOBAL CONST $CCS_NOPARENTALIGN = 8
GLOBAL CONST $CCS_NOHILITE = 16
GLOBAL CONST $CCS_ADJUSTABLE = 32
GLOBAL CONST $CCS_NODIVIDER = 64
GLOBAL CONST $CCS_VERT = 128
GLOBAL CONST $CCS_LEFT = 129
GLOBAL CONST $CCS_NOMOVEX = 130
GLOBAL CONST $CCS_RIGHT = 131
GLOBAL CONST $DT_DRIVETYPE = 1
GLOBAL CONST $DT_SSDSTATUS = 2
GLOBAL CONST $DT_BUSTYPE = 3
GLOBAL CONST $PROXY_IE = 0
GLOBAL CONST $PROXY_NONE = 1
GLOBAL CONST $PROXY_SPECIFIED = 2
GLOBAL CONST $OBJID_WINDOW = 0
GLOBAL CONST $OBJID_TITLEBAR = -2
GLOBAL CONST $OBJID_SIZEGRIP = -7
GLOBAL CONST $OBJID_CARET = -8
GLOBAL CONST $OBJID_CURSOR = -9
GLOBAL CONST $OBJID_ALERT = -10
GLOBAL CONST $OBJID_SOUND = -11
GLOBAL CONST $DLG_CENTERONTOP = 0
GLOBAL CONST $DLG_NOTITLE = 1
GLOBAL CONST $DLG_NOTONTOP = 2
GLOBAL CONST $DLG_TEXTLEFT = 4
GLOBAL CONST $DLG_TEXTRIGHT = 8
GLOBAL CONST $DLG_MOVEABLE = 16
GLOBAL CONST $DLG_TEXTVCENTER = 32
GLOBAL CONST $MCID_UNKNOWN = -1
GLOBAL CONST $MCID_HAND = 0
GLOBAL CONST $MCID_APPSTARTING = 1
GLOBAL CONST $MCID_ARROW = 2
GLOBAL CONST $MCID_CROSS = 3
GLOBAL CONST $MCID_HELP = 4
GLOBAL CONST $MCID_IBEAM = 5
GLOBAL CONST $MCID_ICON = 6
GLOBAL CONST $MCID_NO = 7
GLOBAL CONST $MCID_SIZE = 8
GLOBAL CONST $MCID_SIZEALL = 9
GLOBAL CONST $MCID_SIZENESW = 10
GLOBAL CONST $MCID_SIZENS = 11
GLOBAL CONST $MCID_SIZENWSE = 12
GLOBAL CONST $MCID_SIZEWE = 13
GLOBAL CONST $MCID_UPARROW = 14
GLOBAL CONST $MCID_WAIT = 15
GLOBAL CONST $MCID_NONE = 16
GLOBAL CONST $SD_LOGOFF = 0
GLOBAL CONST $SD_SHUTDOWN = 1
GLOBAL CONST $SD_REBOOT = 2
GLOBAL CONST $SD_FORCE = 4
GLOBAL CONST $SD_POWERDOWN = 8
GLOBAL CONST $SD_FORCEHUNG = 16
GLOBAL CONST $SD_STANDBY = 32
GLOBAL CONST $SD_HIBERNATE = 64
GLOBAL CONST $STDIN_CHILD = 1
GLOBAL CONST $STDOUT_CHILD = 2
GLOBAL CONST $STDERR_CHILD = 4
GLOBAL CONST $STDERR_MERGED = 8
GLOBAL CONST $STDIO_INHERIT_PARENT = 16
GLOBAL CONST $RUN_CREATE_NEW_CONSOLE = 65536
GLOBAL CONST $UBOUND_DIMENSIONS = 0
GLOBAL CONST $UBOUND_ROWS = 1
GLOBAL CONST $UBOUND_COLUMNS = 2
GLOBAL CONST $MOUSEEVENTF_ABSOLUTE = 32768
GLOBAL CONST $MOUSEEVENTF_MOVE = 1
GLOBAL CONST $MOUSEEVENTF_LEFTDOWN = 2
GLOBAL CONST $MOUSEEVENTF_LEFTUP = 4
GLOBAL CONST $MOUSEEVENTF_RIGHTDOWN = 8
GLOBAL CONST $MOUSEEVENTF_RIGHTUP = 16
GLOBAL CONST $MOUSEEVENTF_MIDDLEDOWN = 32
GLOBAL CONST $MOUSEEVENTF_MIDDLEUP = 64
GLOBAL CONST $MOUSEEVENTF_WHEEL = 2048
GLOBAL CONST $MOUSEEVENTF_XDOWN = 128
GLOBAL CONST $MOUSEEVENTF_XUP = 256
GLOBAL CONST $REG_NONE = 0
GLOBAL CONST $REG_SZ = 1
GLOBAL CONST $REG_EXPAND_SZ = 2
GLOBAL CONST $REG_BINARY = 3
GLOBAL CONST $REG_DWORD = 4
GLOBAL CONST $REG_DWORD_LITTLE_ENDIAN = 4
GLOBAL CONST $REG_DWORD_BIG_ENDIAN = 5
GLOBAL CONST $REG_LINK = 6
GLOBAL CONST $REG_MULTI_SZ = 7
GLOBAL CONST $REG_RESOURCE_LIST = 8
GLOBAL CONST $REG_FULL_RESOURCE_DESCRIPTOR = 9
GLOBAL CONST $REG_RESOURCE_REQUIREMENTS_LIST = 10
GLOBAL CONST $REG_QWORD = 11
GLOBAL CONST $REG_QWORD_LITTLE_ENDIAN = 11
GLOBAL CONST $HWND_BOTTOM = 1
GLOBAL CONST $HWND_NOTOPMOST = -2
GLOBAL CONST $HWND_TOP = 0
GLOBAL CONST $HWND_TOPMOST = -1
GLOBAL CONST $SWP_NOSIZE = 1
GLOBAL CONST $SWP_NOMOVE = 2
GLOBAL CONST $SWP_NOZORDER = 4
GLOBAL CONST $SWP_NOREDRAW = 8
GLOBAL CONST $SWP_NOACTIVATE = 16
GLOBAL CONST $SWP_FRAMECHANGED = 32
GLOBAL CONST $SWP_DRAWFRAME = 32
GLOBAL CONST $SWP_SHOWWINDOW = 64
GLOBAL CONST $SWP_HIDEWINDOW = 128
GLOBAL CONST $SWP_NOCOPYBITS = 256
GLOBAL CONST $SWP_NOOWNERZORDER = 512
GLOBAL CONST $SWP_NOREPOSITION = 512
GLOBAL CONST $SWP_NOSENDCHANGING = 1024
GLOBAL CONST $SWP_DEFERERASE = 8192
GLOBAL CONST $SWP_ASYNCWINDOWPOS = 16384
GLOBAL CONST $KEYWORD_DEFAULT = 1
GLOBAL CONST $KEYWORD_NULL = 2
GLOBAL CONST $DECLARED_LOCAL = -1
GLOBAL CONST $DECLARED_UNKNOWN = 0
GLOBAL CONST $DECLARED_GLOBAL = 1
GLOBAL CONST $ASSIGN_CREATE = 0
GLOBAL CONST $ASSIGN_FORCELOCAL = 1
GLOBAL CONST $ASSIGN_FORCEGLOBAL = 2
GLOBAL CONST $ASSIGN_EXISTFAIL = 4
GLOBAL CONST $BI_ENABLE = 0
GLOBAL CONST $BI_DISABLE = 1
GLOBAL CONST $BREAK_ENABLE = 1
GLOBAL CONST $BREAK_DISABLE = 0
GLOBAL CONST $CDTRAY_OPEN = "open"
GLOBAL CONST $CDTRAY_CLOSED = "closed"
GLOBAL CONST $SEND_DEFAULT = 0
GLOBAL CONST $SEND_RAW = 1
GLOBAL CONST $DIR_DEFAULT = 0
GLOBAL CONST $DIR_EXTENDED = 1
GLOBAL CONST $DIR_NORECURSE = 2
GLOBAL CONST $DIR_REMOVE = 1
GLOBAL CONST $DT_ALL = "ALL"
GLOBAL CONST $DT_CDROM = "CDROM"
GLOBAL CONST $DT_REMOVABLE = "REMOVABLE"
GLOBAL CONST $DT_FIXED = "FIXED"
GLOBAL CONST $DT_NETWORK = "NETWORK"
GLOBAL CONST $DT_RAMDISK = "RAMDISK"
GLOBAL CONST $DT_UNKNOWN = "UNKNOWN"
GLOBAL CONST $DT_UNDEFINED = 1
GLOBAL CONST $DT_FAT = "FAT"
GLOBAL CONST $DT_FAT32 = "FAT32"
GLOBAL CONST $DT_EXFAT = "exFAT"
GLOBAL CONST $DT_NTFS = "NTFS"
GLOBAL CONST $DT_NWFS = "NWFS"
GLOBAL CONST $DT_CDFS = "CDFS"
GLOBAL CONST $DT_UDF = "UDF"
GLOBAL CONST $DMA_DEFAULT = 0
GLOBAL CONST $DMA_PERSISTENT = 1
GLOBAL CONST $DMA_AUTHENTICATION = 8
GLOBAL CONST $DS_UNKNOWN = "UNKNOWN"
GLOBAL CONST $DS_READY = "READY"
GLOBAL CONST $DS_NOTREADY = "NOTREADY"
GLOBAL CONST $DS_INVALID = "INVALID"
GLOBAL CONST $MOUSE_CLICK_LEFT = "left"
GLOBAL CONST $MOUSE_CLICK_RIGHT = "right"
GLOBAL CONST $MOUSE_CLICK_MIDDLE = "middle"
GLOBAL CONST $MOUSE_CLICK_MAIN = "main"
GLOBAL CONST $MOUSE_CLICK_MENU = "menu"
GLOBAL CONST $MOUSE_CLICK_PRIMARY = "primary"
GLOBAL CONST $MOUSE_CLICK_SECONDARY = "secondary"
GLOBAL CONST $MOUSE_WHEEL_UP = "up"
GLOBAL CONST $MOUSE_WHEEL_DOWN = "down"
GLOBAL CONST $NUMBER_AUTO = 0
GLOBAL CONST $NUMBER_32BIT = 1
GLOBAL CONST $NUMBER_64BIT = 2
GLOBAL CONST $NUMBER_DOUBLE = 3
GLOBAL CONST $OBJ_NAME = 1
GLOBAL CONST $OBJ_STRING = 2
GLOBAL CONST $OBJ_PROGID = 3
GLOBAL CONST $OBJ_FILE = 4
GLOBAL CONST $OBJ_MODULE = 5
GLOBAL CONST $OBJ_CLSID = 6
GLOBAL CONST $OBJ_IID = 7
GLOBAL CONST $EXITCLOSE_NORMAL = 0
GLOBAL CONST $EXITCLOSE_BYEXIT = 1
GLOBAL CONST $EXITCLOSE_BYCLICK = 2
GLOBAL CONST $EXITCLOSE_BYLOGOFF = 3
GLOBAL CONST $EXITCLOSE_BYSHUTDOWN = 4
GLOBAL CONST $PROCESS_STATS_MEMORY = 0
GLOBAL CONST $PROCESS_STATS_IO = 1
GLOBAL CONST $PROCESS_LOW = 0
GLOBAL CONST $PROCESS_BELOWNORMAL = 1
GLOBAL CONST $PROCESS_NORMAL = 2
GLOBAL CONST $PROCESS_ABOVENORMAL = 3
GLOBAL CONST $PROCESS_HIGH = 4
GLOBAL CONST $PROCESS_REALTIME = 5
GLOBAL CONST $RUN_LOGON_NOPROFILE = 0
GLOBAL CONST $RUN_LOGON_PROFILE = 1
GLOBAL CONST $RUN_LOGON_NETWORK = 2
GLOBAL CONST $RUN_LOGON_INHERIT = 4
GLOBAL CONST $SOUND_NOWAIT = 0
GLOBAL CONST $SOUND_WAIT = 1
GLOBAL CONST $SHEX_OPEN = "open"
GLOBAL CONST $SHEX_EDIT = "edit"
GLOBAL CONST $SHEX_PRINT = "print"
GLOBAL CONST $SHEX_PROPERTIES = "properties"
GLOBAL CONST $TCP_DATA_DEFAULT = 0
GLOBAL CONST $TCP_DATA_BINARY = 1
GLOBAL CONST $UDP_OPEN_DEFAULT = 0
GLOBAL CONST $UDP_OPEN_BROADCAST = 1
GLOBAL CONST $UDP_DATA_DEFAULT = 0
GLOBAL CONST $UDP_DATA_BINARY = 1
GLOBAL CONST $UDP_DATA_ARRAY = 2
GLOBAL CONST $TIP_NOICON = 0
GLOBAL CONST $TIP_INFOICON = 1
GLOBAL CONST $TIP_WARNINGICON = 2
GLOBAL CONST $TIP_ERRORICON = 3
GLOBAL CONST $TIP_BALLOON = 1
GLOBAL CONST $TIP_CENTER = 2
GLOBAL CONST $TIP_FORCEVISIBLE = 4
GLOBAL CONST $WINDOWS_NOONTOP = 0
GLOBAL CONST $WINDOWS_ONTOP = 1
GLOBAL CONST $WIN_STATE_EXISTS = 1
GLOBAL CONST $WIN_STATE_VISIBLE = 2
GLOBAL CONST $WIN_STATE_ENABLED = 4
GLOBAL CONST $WIN_STATE_ACTIVE = 8
GLOBAL CONST $WIN_STATE_MINIMIZED = 16
GLOBAL CONST $WIN_STATE_MAXIMIZED = 32
GLOBAL CONST $FW_DONTCARE = 0
GLOBAL CONST $FW_THIN = 100
GLOBAL CONST $FW_EXTRALIGHT = 200
GLOBAL CONST $FW_ULTRALIGHT = 200
GLOBAL CONST $FW_LIGHT = 300
GLOBAL CONST $FW_NORMAL = 400
GLOBAL CONST $FW_REGULAR = 400
GLOBAL CONST $FW_MEDIUM = 500
GLOBAL CONST $FW_SEMIBOLD = 600
GLOBAL CONST $FW_DEMIBOLD = 600
GLOBAL CONST $FW_BOLD = 700
GLOBAL CONST $FW_EXTRABOLD = 800
GLOBAL CONST $FW_ULTRABOLD = 800
GLOBAL CONST $FW_HEAVY = 900
GLOBAL CONST $FW_BLACK = 900
GLOBAL CONST $CF_EFFECTS = 256
GLOBAL CONST $CF_PRINTERFONTS = 2
GLOBAL CONST $CF_SCREENFONTS = 1
GLOBAL CONST $CF_NOSCRIPTSEL = 8388608
GLOBAL CONST $CF_INITTOLOGFONTSTRUCT = 64
GLOBAL CONST $LOGPIXELSX = 88
GLOBAL CONST $LOGPIXELSY = 90
GLOBAL CONST $ANSI_CHARSET = 0
GLOBAL CONST $ARABIC_CHARSET = 178
GLOBAL CONST $BALTIC_CHARSET = 186
GLOBAL CONST $CHINESEBIG5_CHARSET = 136
GLOBAL CONST $DEFAULT_CHARSET = 1
GLOBAL CONST $EASTEUROPE_CHARSET = 238
GLOBAL CONST $GB2312_CHARSET = 134
GLOBAL CONST $GREEK_CHARSET = 161
GLOBAL CONST $HANGEUL_CHARSET = 129
GLOBAL CONST $HEBREW_CHARSET = 177
GLOBAL CONST $JOHAB_CHARSET = 130
GLOBAL CONST $MAC_CHARSET = 77
GLOBAL CONST $OEM_CHARSET = 255
GLOBAL CONST $RUSSIAN_CHARSET = 204
GLOBAL CONST $SHIFTJIS_CHARSET = 128
GLOBAL CONST $SYMBOL_CHARSET = 2
GLOBAL CONST $THAI_CHARSET = 222
GLOBAL CONST $TURKISH_CHARSET = 162
GLOBAL CONST $VIETNAMESE_CHARSET = 163
GLOBAL CONST $OUT_CHARACTER_PRECIS = 2
GLOBAL CONST $OUT_DEFAULT_PRECIS = 0
GLOBAL CONST $OUT_DEVICE_PRECIS = 5
GLOBAL CONST $OUT_OUTLINE_PRECIS = 8
GLOBAL CONST $OUT_PS_ONLY_PRECIS = 10
GLOBAL CONST $OUT_RASTER_PRECIS = 6
GLOBAL CONST $OUT_STRING_PRECIS = 1
GLOBAL CONST $OUT_STROKE_PRECIS = 3
GLOBAL CONST $OUT_TT_ONLY_PRECIS = 7
GLOBAL CONST $OUT_TT_PRECIS = 4
GLOBAL CONST $CLIP_CHARACTER_PRECIS = 1
GLOBAL CONST $CLIP_DEFAULT_PRECIS = 0
GLOBAL CONST $CLIP_DFA_DISABLE = 48
GLOBAL CONST $CLIP_EMBEDDED = 128
GLOBAL CONST $CLIP_LH_ANGLES = 16
GLOBAL CONST $CLIP_MASK = 15
GLOBAL CONST $CLIP_DFA_OVERRIDE = 64
GLOBAL CONST $CLIP_STROKE_PRECIS = 2
GLOBAL CONST $CLIP_TT_ALWAYS = 32
GLOBAL CONST $ANTIALIASED_QUALITY = 4
GLOBAL CONST $DEFAULT_QUALITY = 0
GLOBAL CONST $DRAFT_QUALITY = 1
GLOBAL CONST $NONANTIALIASED_QUALITY = 3
GLOBAL CONST $PROOF_QUALITY = 2
GLOBAL CONST $CLEARTYPE_QUALITY = 5
GLOBAL CONST $DEFAULT_PITCH = 0
GLOBAL CONST $FIXED_PITCH = 1
GLOBAL CONST $VARIABLE_PITCH = 2
GLOBAL CONST $FF_DECORATIVE = 80
GLOBAL CONST $FF_DONTCARE = 0
GLOBAL CONST $FF_MODERN = 48
GLOBAL CONST $FF_ROMAN = 16
GLOBAL CONST $FF_SCRIPT = 64
GLOBAL CONST $FF_SWISS = 32
GLOBAL CONST $FS_REGULAR = 0
GLOBAL CONST $FS_BOLD = 1
GLOBAL CONST $FS_ITALIC = 2
GLOBAL CONST $TAGPOINT = "struct;long X;long Y;endstruct"
GLOBAL CONST $TAGRECT = "struct;long Left;long Top;long Right;long Bottom;endstruct"
GLOBAL CONST $TAGSIZE = "struct;long X;long Y;endstruct"
GLOBAL CONST $TAGMARGINS = "int cxLeftWidth;int cxRightWidth;int cyTopHeight;int cyBottomHeight"
GLOBAL CONST $TAGFILETIME = "struct;dword Lo;dword Hi;endstruct"
GLOBAL CONST $TAGSYSTEMTIME = "struct;word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds;endstruct"
GLOBAL CONST $TAGTIME_ZONE_INFORMATION = "struct;long Bias;wchar StdName[32];word StdDate[8];long StdBias;wchar DayName[32];word DayDate[8];long DayBias;endstruct"
GLOBAL CONST $TAGNMHDR = "struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct"
GLOBAL CONST $TAGCOMBOBOXEXITEM = "uint Mask;int_ptr Item;ptr Text;int TextMax;int Image;int SelectedImage;int OverlayImage;" & "int Indent;lparam Param"
GLOBAL CONST $TAGNMCBEDRAGBEGIN = $TAGNMHDR & ";int ItemID;wchar szText[260]"
GLOBAL CONST $TAGNMCBEENDEDIT = $TAGNMHDR & ";bool fChanged;int NewSelection;wchar szText[260];int Why"
GLOBAL CONST $TAGNMCOMBOBOXEX = $TAGNMHDR & ";uint Mask;int_ptr Item;ptr Text;int TextMax;int Image;" & "int SelectedImage;int OverlayImage;int Indent;lparam Param"
GLOBAL CONST $TAGDTPRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;" & "word MinSecond;word MinMSecond;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;" & "word MaxMinute;word MaxSecond;word MaxMSecond;bool MinValid;bool MaxValid"
GLOBAL CONST $TAGNMDATETIMECHANGE = $TAGNMHDR & ";dword Flag;" & $TAGSYSTEMTIME
GLOBAL CONST $TAGNMDATETIMEFORMAT = $TAGNMHDR & ";ptr Format;" & $TAGSYSTEMTIME & ";ptr pDisplay;wchar Display[64]"
GLOBAL CONST $TAGNMDATETIMEFORMATQUERY = $TAGNMHDR & ";ptr Format;struct;long SizeX;long SizeY;endstruct"
GLOBAL CONST $TAGNMDATETIMEKEYDOWN = $TAGNMHDR & ";int VirtKey;ptr Format;" & $TAGSYSTEMTIME
GLOBAL CONST $TAGNMDATETIMESTRING = $TAGNMHDR & ";ptr UserString;" & $TAGSYSTEMTIME & ";dword Flags"
GLOBAL CONST $TAGEVENTLOGRECORD = "dword Length;dword Reserved;dword RecordNumber;dword TimeGenerated;dword TimeWritten;dword EventID;" & "word EventType;word NumStrings;word EventCategory;word ReservedFlags;dword ClosingRecordNumber;dword StringOffset;" & "dword UserSidLength;dword UserSidOffset;dword DataLength;dword DataOffset"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_BLUR = "float Radius; bool ExpandEdge"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_BRIGHTNESSCONTRAST = "int BrightnessLevel; int ContrastLevel"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_COLORBALANCE = "int CyanRed; int MagentaGreen; int YellowBlue"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_COLORCURVE = "int Adjustment; int Channel; int AdjustValue"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_COLORLUT = "byte LutB[256]; byte LutG[256]; byte LutR[256]; byte LutA[256]"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_HUESATURATIONLIGHTNESS = "int HueLevel; int SaturationLevel; int LightnessLevel"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_LEVELS = "int Highlight; int Midtone; int Shadow"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_REDEYECORRECTION = "uint NumberOfAreas; ptr Areas"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_SHARPEN = "float Radius; float Amount"
GLOBAL CONST $TAGGDIP_EFFECTPARAMS_TINT = "int Hue; int Amount"
GLOBAL CONST $TAGGDIPBITMAPDATA = "uint Width;uint Height;int Stride;int Format;ptr Scan0;uint_ptr Reserved"
GLOBAL CONST $TAGGDIPCOLORMATRIX = "float m[25]"
GLOBAL CONST $TAGGDIPENCODERPARAM = "struct;byte GUID[16];ulong NumberOfValues;ulong Type;ptr Values;endstruct"
GLOBAL CONST $TAGGDIPENCODERPARAMS = "uint Count;" & $TAGGDIPENCODERPARAM
GLOBAL CONST $TAGGDIPRECTF = "struct;float X;float Y;float Width;float Height;endstruct"
GLOBAL CONST $TAGGDIPSTARTUPINPUT = "uint Version;ptr Callback;bool NoThread;bool NoCodecs"
GLOBAL CONST $TAGGDIPSTARTUPOUTPUT = "ptr HookProc;ptr UnhookProc"
GLOBAL CONST $TAGGDIPIMAGECODECINFO = "byte CLSID[16];byte FormatID[16];ptr CodecName;ptr DllName;ptr FormatDesc;ptr FileExt;" & "ptr MimeType;dword Flags;dword Version;dword SigCount;dword SigSize;ptr SigPattern;ptr SigMask"
GLOBAL CONST $TAGGDIPPENCODERPARAMS = "uint Count;byte Params[1]"
GLOBAL CONST $TAGHDITEM = "uint Mask;int XY;ptr Text;handle hBMP;int TextMax;int Fmt;lparam Param;int Image;int Order;uint Type;ptr pFilter;uint State"
GLOBAL CONST $TAGNMHDDISPINFO = $TAGNMHDR & ";int Item;uint Mask;ptr Text;int TextMax;int Image;lparam lParam"
GLOBAL CONST $TAGNMHDFILTERBTNCLICK = $TAGNMHDR & ";int Item;" & $TAGRECT
GLOBAL CONST $TAGNMHEADER = $TAGNMHDR & ";int Item;int Button;ptr pItem"
GLOBAL CONST $TAGGETIPADDRESS = "byte Field4;byte Field3;byte Field2;byte Field1"
GLOBAL CONST $TAGNMIPADDRESS = $TAGNMHDR & ";int Field;int Value"
GLOBAL CONST $TAGLVFINDINFO = "struct;uint Flags;ptr Text;lparam Param;" & $TAGPOINT & ";uint Direction;endstruct"
GLOBAL CONST $TAGLVHITTESTINFO = $TAGPOINT & ";uint Flags;int Item;int SubItem;int iGroup"
GLOBAL CONST $TAGLVITEM = "struct;uint Mask;int Item;int SubItem;uint State;uint StateMask;ptr Text;int TextMax;int Image;lparam Param;" & "int Indent;int GroupID;uint Columns;ptr pColumns;ptr piColFmt;int iGroup;endstruct"
GLOBAL CONST $TAGNMLISTVIEW = $TAGNMHDR & ";int Item;int SubItem;uint NewState;uint OldState;uint Changed;" & "struct;long ActionX;long ActionY;endstruct;lparam Param"
GLOBAL CONST $TAGNMLVCUSTOMDRAW = "struct;" & $TAGNMHDR & ";dword dwDrawStage;handle hdc;" & $TAGRECT & ";dword_ptr dwItemSpec;uint uItemState;lparam lItemlParam;endstruct" & ";dword clrText;dword clrTextBk;int iSubItem;dword dwItemType;dword clrFace;int iIconEffect;" & "int iIconPhase;int iPartID;int iStateID;struct;long TextLeft;long TextTop;long TextRight;long TextBottom;endstruct;uint uAlign"
GLOBAL CONST $TAGNMLVDISPINFO = $TAGNMHDR & ";" & $TAGLVITEM
GLOBAL CONST $TAGNMLVFINDITEM = $TAGNMHDR & ";int Start;" & $TAGLVFINDINFO
GLOBAL CONST $TAGNMLVGETINFOTIP = $TAGNMHDR & ";dword Flags;ptr Text;int TextMax;int Item;int SubItem;lparam lParam"
GLOBAL CONST $TAGNMITEMACTIVATE = $TAGNMHDR & ";int Index;int SubItem;uint NewState;uint OldState;uint Changed;" & $TAGPOINT & ";lparam lParam;uint KeyFlags"
GLOBAL CONST $TAGNMLVKEYDOWN = $TAGNMHDR & ";align 2;word VKey;uint Flags"
GLOBAL CONST $TAGNMLVSCROLL = $TAGNMHDR & ";int DX;int DY"
GLOBAL CONST $TAGMCHITTESTINFO = "uint Size;" & $TAGPOINT & ";uint Hit;" & $TAGSYSTEMTIME & ";" & $TAGRECT & ";int iOffset;int iRow;int iCol"
GLOBAL CONST $TAGMCMONTHRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;word MinSecond;" & "word MinMSeconds;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;word MaxMinute;word MaxSecond;" & "word MaxMSeconds;short Span"
GLOBAL CONST $TAGMCRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;word MinSecond;" & "word MinMSeconds;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;word MaxMinute;word MaxSecond;" & "word MaxMSeconds;short MinSet;short MaxSet"
GLOBAL CONST $TAGMCSELRANGE = "word MinYear;word MinMonth;word MinDOW;word MinDay;word MinHour;word MinMinute;word MinSecond;" & "word MinMSeconds;word MaxYear;word MaxMonth;word MaxDOW;word MaxDay;word MaxHour;word MaxMinute;word MaxSecond;" & "word MaxMSeconds"
GLOBAL CONST $TAGNMDAYSTATE = $TAGNMHDR & ";" & $TAGSYSTEMTIME & ";int DayState;ptr pDayState"
GLOBAL CONST $TAGNMSELCHANGE = $TAGNMHDR & ";struct;word BegYear;word BegMonth;word BegDOW;word BegDay;word BegHour;word BegMinute;word BegSecond;word BegMSeconds;endstruct;" & "struct;word EndYear;word EndMonth;word EndDOW;word EndDay;word EndHour;word EndMinute;word EndSecond;word EndMSeconds;endstruct"
GLOBAL CONST $TAGNMOBJECTNOTIFY = $TAGNMHDR & ";int Item;ptr piid;ptr pObject;long Result;dword dwFlags"
GLOBAL CONST $TAGNMTCKEYDOWN = $TAGNMHDR & ";align 2;word VKey;uint Flags"
GLOBAL CONST $TAGTVITEM = "struct;uint Mask;handle hItem;uint State;uint StateMask;ptr Text;int TextMax;int Image;int SelectedImage;" & "int Children;lparam Param;endstruct"
GLOBAL CONST $TAGTVITEMEX = "struct;" & $TAGTVITEM & ";int Integral;uint uStateEx;hwnd hwnd;int iExpandedImage;int iReserved;endstruct"
GLOBAL CONST $TAGNMTREEVIEW = $TAGNMHDR & ";uint Action;" & "struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;" & "ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;" & "struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;" & "ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;" & "struct;long PointX;long PointY;endstruct"
GLOBAL CONST $TAGNMTVCUSTOMDRAW = "struct;" & $TAGNMHDR & ";dword DrawStage;handle HDC;" & $TAGRECT & ";dword_ptr ItemSpec;uint ItemState;lparam ItemParam;endstruct" & ";dword ClrText;dword ClrTextBk;int Level"
GLOBAL CONST $TAGNMTVDISPINFO = $TAGNMHDR & ";" & $TAGTVITEM
GLOBAL CONST $TAGNMTVGETINFOTIP = $TAGNMHDR & ";ptr Text;int TextMax;handle hItem;lparam lParam"
GLOBAL CONST $TAGNMTVITEMCHANGE = $TAGNMHDR & ";uint Changed;handle hItem;uint StateNew;uint StateOld;lparam lParam;"
GLOBAL CONST $TAGTVHITTESTINFO = $TAGPOINT & ";uint Flags;handle Item"
GLOBAL CONST $TAGNMTVKEYDOWN = $TAGNMHDR & ";align 2;word VKey;uint Flags"
GLOBAL CONST $TAGNMMOUSE = $TAGNMHDR & ";dword_ptr ItemSpec;dword_ptr ItemData;" & $TAGPOINT & ";lparam HitInfo"
GLOBAL CONST $TAGTOKEN_PRIVILEGES = "dword Count;align 4;int64 LUID;dword Attributes"
GLOBAL CONST $TAGIMAGEINFO = "handle hBitmap;handle hMask;int Unused1;int Unused2;" & $TAGRECT
GLOBAL CONST $TAGMENUINFO = "dword Size;INT Mask;dword Style;uint YMax;handle hBack;dword ContextHelpID;ulong_ptr MenuData"
GLOBAL CONST $TAGMENUITEMINFO = "uint Size;uint Mask;uint Type;uint State;uint ID;handle SubMenu;handle BmpChecked;handle BmpUnchecked;" & "ulong_ptr ItemData;ptr TypeData;uint CCH;handle BmpItem"
GLOBAL CONST $TAGREBARBANDINFO = "uint cbSize;uint fMask;uint fStyle;dword clrFore;dword clrBack;ptr lpText;uint cch;" & "int iImage;hwnd hwndChild;uint cxMinChild;uint cyMinChild;uint cx;handle hbmBack;uint wID;uint cyChild;uint cyMaxChild;" & "uint cyIntegral;uint cxIdeal;lparam lParam;uint cxHeader" & ((@OSVERSION = "WIN_XP") ? "" : ";" & $TAGRECT & ";uint uChevronState")
GLOBAL CONST $TAGNMREBARAUTOBREAK = $TAGNMHDR & ";uint uBand;uint wID;lparam lParam;uint uMsg;uint fStyleCurrent;bool fAutoBreak"
GLOBAL CONST $TAGNMRBAUTOSIZE = $TAGNMHDR & ";bool fChanged;" & "struct;long TargetLeft;long TargetTop;long TargetRight;long TargetBottom;endstruct;" & "struct;long ActualLeft;long ActualTop;long ActualRight;long ActualBottom;endstruct"
GLOBAL CONST $TAGNMREBAR = $TAGNMHDR & ";dword dwMask;uint uBand;uint fStyle;uint wID;lparam lParam"
GLOBAL CONST $TAGNMREBARCHEVRON = $TAGNMHDR & ";uint uBand;uint wID;lparam lParam;" & $TAGRECT & ";lparam lParamNM"
GLOBAL CONST $TAGNMREBARCHILDSIZE = $TAGNMHDR & ";uint uBand;uint wID;" & "struct;long CLeft;long CTop;long CRight;long CBottom;endstruct;" & "struct;long BLeft;long BTop;long BRight;long BBottom;endstruct"
GLOBAL CONST $TAGCOLORSCHEME = "dword Size;dword BtnHighlight;dword BtnShadow"
GLOBAL CONST $TAGNMTOOLBAR = $TAGNMHDR & ";int iItem;" & "struct;int iBitmap;int idCommand;byte fsState;byte fsStyle;dword_ptr dwData;int_ptr iString;endstruct" & ";int cchText;ptr pszText;" & $TAGRECT
GLOBAL CONST $TAGNMTBHOTITEM = $TAGNMHDR & ";int idOld;int idNew;dword dwFlags"
GLOBAL CONST $TAGTBBUTTON = "int Bitmap;int Command;byte State;byte Style;dword_ptr Param;int_ptr String"
GLOBAL CONST $TAGTBBUTTONINFO = "uint Size;dword Mask;int Command;int Image;byte State;byte Style;word CX;dword_ptr Param;ptr Text;int TextMax"
GLOBAL CONST $TAGNETRESOURCE = "dword Scope;dword Type;dword DisplayType;dword Usage;ptr LocalName;ptr RemoteName;ptr Comment;ptr Provider"
GLOBAL CONST $TAGOVERLAPPED = "ulong_ptr Internal;ulong_ptr InternalHigh;struct;dword Offset;dword OffsetHigh;endstruct;handle hEvent"
GLOBAL CONST $TAGOPENFILENAME = "dword StructSize;hwnd hwndOwner;handle hInstance;ptr lpstrFilter;ptr lpstrCustomFilter;" & "dword nMaxCustFilter;dword nFilterIndex;ptr lpstrFile;dword nMaxFile;ptr lpstrFileTitle;dword nMaxFileTitle;" & "ptr lpstrInitialDir;ptr lpstrTitle;dword Flags;word nFileOffset;word nFileExtension;ptr lpstrDefExt;lparam lCustData;" & "ptr lpfnHook;ptr lpTemplateName;ptr pvReserved;dword dwReserved;dword FlagsEx"
GLOBAL CONST $TAGBITMAPINFOHEADER = "struct;dword biSize;long biWidth;long biHeight;word biPlanes;word biBitCount;" & "dword biCompression;dword biSizeImage;long biXPelsPerMeter;long biYPelsPerMeter;dword biClrUsed;dword biClrImportant;endstruct"
GLOBAL CONST $TAGBITMAPINFO = $TAGBITMAPINFOHEADER & ";dword biRGBQuad[1]"
GLOBAL CONST $TAGBLENDFUNCTION = "byte Op;byte Flags;byte Alpha;byte Format"
GLOBAL CONST $TAGGUID = "struct;ulong Data1;ushort Data2;ushort Data3;byte Data4[8];endstruct"
GLOBAL CONST $TAGWINDOWPLACEMENT = "uint length;uint flags;uint showCmd;long ptMinPosition[2];long ptMaxPosition[2];long rcNormalPosition[4]"
GLOBAL CONST $TAGWINDOWPOS = "hwnd hWnd;hwnd InsertAfter;int X;int Y;int CX;int CY;uint Flags"
GLOBAL CONST $TAGSCROLLINFO = "uint cbSize;uint fMask;int nMin;int nMax;uint nPage;int nPos;int nTrackPos"
GLOBAL CONST $TAGSCROLLBARINFO = "dword cbSize;" & $TAGRECT & ";int dxyLineButton;int xyThumbTop;" & "int xyThumbBottom;int reserved;dword rgstate[6]"
GLOBAL CONST $TAGLOGFONT = "struct;long Height;long Width;long Escapement;long Orientation;long Weight;byte Italic;byte Underline;" & "byte Strikeout;byte CharSet;byte OutPrecision;byte ClipPrecision;byte Quality;byte PitchAndFamily;wchar FaceName[32];endstruct"
GLOBAL CONST $TAGKBDLLHOOKSTRUCT = "dword vkCode;dword scanCode;dword flags;dword time;ulong_ptr dwExtraInfo"
GLOBAL CONST $TAGPROCESS_INFORMATION = "handle hProcess;handle hThread;dword ProcessID;dword ThreadID"
GLOBAL CONST $TAGSTARTUPINFO = "dword Size;ptr Reserved1;ptr Desktop;ptr Title;dword X;dword Y;dword XSize;dword YSize;dword XCountChars;" & "dword YCountChars;dword FillAttribute;dword Flags;word ShowWindow;word Reserved2;ptr Reserved3;handle StdInput;" & "handle StdOutput;handle StdError"
GLOBAL CONST $TAGSECURITY_ATTRIBUTES = "dword Length;ptr Descriptor;bool InheritHandle"
GLOBAL CONST $TAGWIN32_FIND_DATA = "dword dwFileAttributes;dword ftCreationTime[2];dword ftLastAccessTime[2];dword ftLastWriteTime[2];dword nFileSizeHigh;dword nFileSizeLow;dword dwReserved0;dword dwReserved1;wchar cFileName[260];wchar cAlternateFileName[14]"
GLOBAL CONST $TAGTEXTMETRIC = "long tmHeight;long tmAscent;long tmDescent;long tmInternalLeading;long tmExternalLeading;" & "long tmAveCharWidth;long tmMaxCharWidth;long tmWeight;long tmOverhang;long tmDigitizedAspectX;long tmDigitizedAspectY;" & "wchar tmFirstChar;wchar tmLastChar;wchar tmDefaultChar;wchar tmBreakChar;byte tmItalic;byte tmUnderlined;byte tmStruckOut;" & "byte tmPitchAndFamily;byte tmCharSet"
GLOBAL CONST $MB_OK = 0
GLOBAL CONST $MB_OKCANCEL = 1
GLOBAL CONST $MB_ABORTRETRYIGNORE = 2
GLOBAL CONST $MB_YESNOCANCEL = 3
GLOBAL CONST $MB_YESNO = 4
GLOBAL CONST $MB_RETRYCANCEL = 5
GLOBAL CONST $MB_CANCELTRYCONTINUE = 6
GLOBAL CONST $MB_HELP = 16384
GLOBAL CONST $MB_ICONNONE = 0
GLOBAL CONST $MB_ICONSTOP = 16
GLOBAL CONST $MB_ICONERROR = 16
GLOBAL CONST $MB_ICONHAND = 16
GLOBAL CONST $MB_ICONQUESTION = 32
GLOBAL CONST $MB_ICONEXCLAMATION = 48
GLOBAL CONST $MB_ICONWARNING = 48
GLOBAL CONST $MB_ICONINFORMATION = 64
GLOBAL CONST $MB_ICONASTERISK = 64
GLOBAL CONST $MB_USERICON = 128
GLOBAL CONST $MB_DEFBUTTON1 = 0
GLOBAL CONST $MB_DEFBUTTON2 = 256
GLOBAL CONST $MB_DEFBUTTON3 = 512
GLOBAL CONST $MB_DEFBUTTON4 = 768
GLOBAL CONST $MB_APPLMODAL = 0
GLOBAL CONST $MB_SYSTEMMODAL = 4096
GLOBAL CONST $MB_TASKMODAL = 8192
GLOBAL CONST $MB_DEFAULT_DESKTOP_ONLY = 131072
GLOBAL CONST $MB_RIGHT = 524288
GLOBAL CONST $MB_RTLREADING = 1048576
GLOBAL CONST $MB_SETFOREGROUND = 65536
GLOBAL CONST $MB_TOPMOST = 262144
GLOBAL CONST $MB_SERVICE_NOTIFICATION = 2097152
GLOBAL CONST $MB_RIGHTJUSTIFIED = $MB_RIGHT
GLOBAL CONST $IDTIMEOUT = -1
GLOBAL CONST $IDOK = 1
GLOBAL CONST $IDCANCEL = 2
GLOBAL CONST $IDABORT = 3
GLOBAL CONST $IDRETRY = 4
GLOBAL CONST $IDIGNORE = 5
GLOBAL CONST $IDYES = 6
GLOBAL CONST $IDNO = 7
GLOBAL CONST $IDCLOSE = 8
GLOBAL CONST $IDHELP = 9
GLOBAL CONST $IDTRYAGAIN = 10
GLOBAL CONST $IDCONTINUE = 11
GLOBAL CONST $STR_NOCASESENSE = 0
GLOBAL CONST $STR_CASESENSE = 1
GLOBAL CONST $STR_NOCASESENSEBASIC = 2
GLOBAL CONST $STR_STRIPLEADING = 1
GLOBAL CONST $STR_STRIPTRAILING = 2
GLOBAL CONST $STR_STRIPSPACES = 4
GLOBAL CONST $STR_STRIPALL = 8
GLOBAL CONST $STR_CHRSPLIT = 0
GLOBAL CONST $STR_ENTIRESPLIT = 1
GLOBAL CONST $STR_NOCOUNT = 2
GLOBAL CONST $STR_REGEXPMATCH = 0
GLOBAL CONST $STR_REGEXPARRAYMATCH = 1
GLOBAL CONST $STR_REGEXPARRAYFULLMATCH = 2
GLOBAL CONST $STR_REGEXPARRAYGLOBALMATCH = 3
GLOBAL CONST $STR_REGEXPARRAYGLOBALFULLMATCH = 4
GLOBAL CONST $STR_ENDISSTART = 0
GLOBAL CONST $STR_ENDNOTSTART = 1
GLOBAL CONST $SB_ANSI = 1
GLOBAL CONST $SB_UTF16LE = 2
GLOBAL CONST $SB_UTF16BE = 3
GLOBAL CONST $SB_UTF8 = 4
GLOBAL CONST $SE_UTF16 = 0
GLOBAL CONST $SE_ANSI = 1
GLOBAL CONST $SE_UTF8 = 2
GLOBAL CONST $STR_UTF16 = 0
GLOBAL CONST $STR_UCS2 = 1
#Region Global Variables and Constants
GLOBAL CONST $FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
GLOBAL CONST $FORMAT_MESSAGE_IGNORE_INSERTS = 512
GLOBAL CONST $FORMAT_MESSAGE_FROM_STRING = 1024
GLOBAL CONST $FORMAT_MESSAGE_FROM_HMODULE = 2048
GLOBAL CONST $FORMAT_MESSAGE_FROM_SYSTEM = 4096
GLOBAL CONST $FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192
#EndRegion Global Variables and Constants
FUNC _WINAPI_BEEP($IFREQ = 500, $IDURATION = 1000)
LOCAL $ACALL = DLLCALL("kernel32.dll", "bool", "Beep", "dword", $IFREQ, "dword", $IDURATION)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
RETURN $ACALL[0]
ENDFUNC
FUNC _WINAPI_FORMATMESSAGE($IFLAGS, $PSOURCE, $IMESSAGEID, $ILANGUAGEID, BYREF $PBUFFER, $ISIZE, $VARGUMENTS)
LOCAL $SBUFFERTYPE = "struct*"
IF ISSTRING($PBUFFER) THEN $SBUFFERTYPE = "wstr"
LOCAL $ACALL = DLLCALL("kernel32.dll", "dword", "FormatMessageW", "dword", $IFLAGS, "struct*", $PSOURCE, "dword", $IMESSAGEID, "dword", $ILANGUAGEID, $SBUFFERTYPE, $PBUFFER, "dword", $ISIZE, "ptr", $VARGUMENTS)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
IF NOT $ACALL[0] THEN RETURN SETERROR(10, _WINAPI_GETLASTERROR(), 0)
IF $SBUFFERTYPE = "wstr" THEN $PBUFFER = $ACALL[5]
RETURN $ACALL[0]
ENDFUNC
FUNC _WINAPI_GETERRORMESSAGE($ICODE, $ILANGUAGE = 0, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
LOCAL $ACALL = DLLCALL("kernel32.dll", "dword", "FormatMessageW", "dword", BITOR($FORMAT_MESSAGE_FROM_SYSTEM, $FORMAT_MESSAGE_IGNORE_INSERTS), "ptr", 0, "dword", $ICODE, "dword", $ILANGUAGE, "wstr", "", "dword", 4096, "ptr", 0)
IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(@ERROR, @EXTENDED, "")
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, STRINGREGEXPREPLACE($ACALL[5], "[" & @LF & "," & @CR & "]*\Z", ""))
ENDFUNC
FUNC _WINAPI_GETLASTERROR(CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
LOCAL $ACALL = DLLCALL("kernel32.dll", "dword", "GetLastError")
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, $ACALL[0])
ENDFUNC
FUNC _WINAPI_GETLASTERRORMESSAGE(CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
LOCAL $ILASTERROR = _WINAPI_GETLASTERROR()
LOCAL $TBUFFERPTR = DLLSTRUCTCREATE("ptr")
LOCAL $NCOUNT = _WINAPI_FORMATMESSAGE(BITOR($FORMAT_MESSAGE_ALLOCATE_BUFFER, $FORMAT_MESSAGE_FROM_SYSTEM, $FORMAT_MESSAGE_IGNORE_INSERTS), 0, $ILASTERROR, 0, $TBUFFERPTR, 0, 0)
IF @ERROR THEN RETURN SETERROR(-@ERROR, @EXTENDED, "")
LOCAL $STEXT = ""
LOCAL $PBUFFER = DLLSTRUCTGETDATA($TBUFFERPTR, 1)
IF $PBUFFER THEN
IF $NCOUNT > 0 THEN
LOCAL $TBUFFER = DLLSTRUCTCREATE("wchar[" & ($NCOUNT + 1) & "]", $PBUFFER)
$STEXT = DLLSTRUCTGETDATA($TBUFFER, 1)
IF STRINGRIGHT($STEXT, 2) = @CRLF THEN $STEXT = STRINGTRIMRIGHT($STEXT, 2)
ENDIF
DLLCALL("kernel32.dll", "handle", "LocalFree", "handle", $PBUFFER)
ENDIF
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, $STEXT)
ENDFUNC
FUNC _WINAPI_MESSAGEBEEP($ITYPE = 1)
LOCAL $ISOUND
SWITCH $ITYPE
CASE 1
$ISOUND = 0
CASE 2
$ISOUND = 16
CASE 3
$ISOUND = 32
CASE 4
$ISOUND = 48
CASE 5
$ISOUND = 64
CASE ELSE
$ISOUND = -1
ENDSWITCH
LOCAL $ACALL = DLLCALL("user32.dll", "bool", "MessageBeep", "uint", $ISOUND)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
RETURN $ACALL[0]
ENDFUNC
FUNC _WINAPI_MSGBOX($IFLAGS, $STITLE, $STEXT)
BLOCKINPUT(0)
MSGBOX($IFLAGS, $STITLE, $STEXT & " ")
ENDFUNC
FUNC _WINAPI_SETLASTERROR($IERRORCODE, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
DLLCALL("kernel32.dll", "none", "SetLastError", "dword", $IERRORCODE)
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, NULL)
ENDFUNC
FUNC _WINAPI_SHOWERROR($STEXT, $BEXIT = TRUE)
BLOCKINPUT(0)
MSGBOX($MB_SYSTEMMODAL, "Error", $STEXT & " ")
IF $BEXIT THEN EXIT
ENDFUNC
FUNC _WINAPI_SHOWLASTERROR($STEXT = "", $BABORT = FALSE, $ILANGUAGE = 0, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
LOCAL $SERROR
LOCAL $ILASTERROR = _WINAPI_GETLASTERROR()
WHILE 1
$SERROR = _WINAPI_GETERRORMESSAGE($ILASTERROR, $ILANGUAGE)
IF @ERROR AND $ILANGUAGE THEN
$ILANGUAGE = 0
ELSE
EXITLOOP
ENDIF
WEND
IF STRINGSTRIPWS($STEXT, $STR_STRIPLEADING + $STR_STRIPTRAILING) THEN
$STEXT &= @CRLF & @CRLF
ELSE
$STEXT = ""
ENDIF
_WINAPI_MSGBOX(BITOR(262144, BITSHIFT(16, -2 * (NOT $ILASTERROR))), $ILASTERROR, $STEXT & $SERROR)
IF $ILASTERROR THEN
_WINAPI_SETLASTERROR($ILASTERROR)
IF $BABORT THEN
EXIT $ILASTERROR
ENDIF
ENDIF
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, 1)
ENDFUNC
FUNC _WINAPI_SHOWMSG($STEXT)
_WINAPI_MSGBOX($MB_SYSTEMMODAL, "Information", $STEXT)
ENDFUNC
FUNC __COMERRORFORMATING(BYREF $OCOMERROR, $SPREFIX = @TAB)
LOCAL CONST $STR_STRIPTRAILING = 2
LOCAL $SERROR = "COM Error encountered in " & @SCRIPTNAME & " (" & $OCOMERROR.Scriptline & ") :" & @CRLF & $SPREFIX & "Number " & @TAB & "= 0x" & HEX($OCOMERROR.Number, 8) & " (" & $OCOMERROR.Number & ")" & @CRLF & $SPREFIX & "WinDescription" & @TAB & "= " & STRINGSTRIPWS($OCOMERROR.WinDescription, $STR_STRIPTRAILING) & @CRLF & $SPREFIX & "Description " & @TAB & "= " & STRINGSTRIPWS($OCOMERROR.Description, $STR_STRIPTRAILING) & @CRLF & $SPREFIX & "Source " & @TAB & "= " & $OCOMERROR.Source & @CRLF & $SPREFIX & "HelpFile " & @TAB & "= " & $OCOMERROR.HelpFile & @CRLF & $SPREFIX & "HelpContext " & @TAB & "= " & $OCOMERROR.HelpContext & @CRLF & $SPREFIX & "LastDllError " & @TAB & "= " & $OCOMERROR.LastDllError & @CRLF & $SPREFIX & "Retcode " & @TAB & "= 0x" & HEX($OCOMERROR.retcode)
RETURN $SERROR
ENDFUNC
GLOBAL CONST $__MISCCONSTANT_CC_ANYCOLOR = 256
GLOBAL CONST $__MISCCONSTANT_CC_FULLOPEN = 2
GLOBAL CONST $__MISCCONSTANT_CC_RGBINIT = 1
GLOBAL CONST $TAGCHOOSECOLOR = "dword Size;hwnd hWndOwnder;handle hInstance;dword rgbResult;ptr CustColors;dword Flags;lparam lCustData;" & "ptr lpfnHook;ptr lpTemplateName"
GLOBAL CONST $TAGCHOOSEFONT = "dword Size;hwnd hWndOwner;handle hDC;ptr LogFont;int PointSize;dword Flags;dword rgbColors;lparam CustData;" & "ptr fnHook;ptr TemplateName;handle hInstance;ptr szStyle;word FontType;int SizeMin;int SizeMax"
FUNC _CHOOSECOLOR($VRETURNTYPE = 0, $ICOLORREF = 0, $IREFTYPE = 0, $HWNDOWNDER = 0)
LOCAL $TAGCUSTCOLORS = "dword[16]"
LOCAL $TCHOOSE = DLLSTRUCTCREATE($TAGCHOOSECOLOR)
LOCAL STATIC $TCC = DLLSTRUCTCREATE($TAGCUSTCOLORS)
LOCAL $IRETURNTYPE, $VRETURN
IF $VRETURNTYPE = -9 OR $VRETURNTYPE = -10 THEN
LOCAL $A_TCC = __CHOOSECOLOR_STRUCTTOARRAY($TCC)
$A_TCC[0] = -1
IF $VRETURNTYPE = -10 THEN $TCC = DLLSTRUCTCREATE($TAGCUSTCOLORS)
RETURN $A_TCC
ELSEIF $VRETURNTYPE > 9 THEN
$TCC = DLLSTRUCTCREATE($TAGCUSTCOLORS)
$IRETURNTYPE = $VRETURNTYPE - 10
ELSEIF ISARRAY($VRETURNTYPE) THEN
IF UBOUND($VRETURNTYPE, $UBOUND_ROWS) = 17 AND UBOUND($VRETURNTYPE, $UBOUND_DIMENSIONS) = 1 THEN
FOR $N = 1 TO 16
DLLSTRUCTSETDATA($TCC, 1, $VRETURNTYPE[$N], $N)
NEXT
IF $VRETURNTYPE[0] = -9 THEN
$VRETURNTYPE[0] = 0
RETURN $VRETURNTYPE
ENDIF
IF $VRETURNTYPE[0] > 9 THEN $VRETURNTYPE[0] -= 10
$IRETURNTYPE = $VRETURNTYPE[0]
ELSE
RETURN SETERROR(-5, 0, -1)
ENDIF
ELSE
$IRETURNTYPE = $VRETURNTYPE
ENDIF
IF $IRETURNTYPE < 0 OR $IRETURNTYPE > 2 THEN
IF ISARRAY($VRETURNTYPE) THEN
$VRETURNTYPE[0] = -1
RETURN SETERROR(-4, 0, $VRETURNTYPE)
ENDIF
RETURN SETERROR(-4, 0, -1)
ENDIF
IF $IREFTYPE = 1 THEN
$ICOLORREF = INT($ICOLORREF)
ELSEIF $IREFTYPE = 2 THEN
$ICOLORREF = HEX(STRING($ICOLORREF), 6)
$ICOLORREF = "0x" & STRINGMID($ICOLORREF, 5, 2) & STRINGMID($ICOLORREF, 3, 2) & STRINGMID($ICOLORREF, 1, 2)
ENDIF
DLLSTRUCTSETDATA($TCHOOSE, "Size", DLLSTRUCTGETSIZE($TCHOOSE))
DLLSTRUCTSETDATA($TCHOOSE, "hWndOwnder", $HWNDOWNDER)
DLLSTRUCTSETDATA($TCHOOSE, "rgbResult", $ICOLORREF)
DLLSTRUCTSETDATA($TCHOOSE, "CustColors", DLLSTRUCTGETPTR($TCC))
DLLSTRUCTSETDATA($TCHOOSE, "Flags", BITOR($__MISCCONSTANT_CC_ANYCOLOR, $__MISCCONSTANT_CC_FULLOPEN, $__MISCCONSTANT_CC_RGBINIT))
LOCAL $ARESULT = DLLCALL("comdlg32.dll", "bool", "ChooseColor", "struct*", $TCHOOSE)
LOCAL $IERROR = @ERROR
IF @ERROR THEN
LOCAL $IEXTENDED = @EXTENDED
IF ISARRAY($VRETURNTYPE) THEN
$VRETURNTYPE[0] = -1
RETURN SETERROR($IERROR, $IEXTENDED, $VRETURNTYPE)
ENDIF
RETURN SETERROR($IERROR, $IEXTENDED, -1)
ENDIF
IF $ARESULT[0] = 0 THEN
IF ISARRAY($VRETURNTYPE) THEN
$VRETURNTYPE[0] = -1
RETURN SETERROR(-3, 0, $VRETURNTYPE)
ENDIF
RETURN SETERROR(-3, 0, -1)
ENDIF
LOCAL $SCOLOR_PICKED = DLLSTRUCTGETDATA($TCHOOSE, "rgbResult")
IF $IRETURNTYPE = 1 THEN
$VRETURN = "0x" & HEX(STRING($SCOLOR_PICKED), 6)
ELSEIF $IRETURNTYPE = 2 THEN
$SCOLOR_PICKED = HEX(STRING($SCOLOR_PICKED), 6)
$VRETURN = "0x" & STRINGMID($SCOLOR_PICKED, 5, 2) & STRINGMID($SCOLOR_PICKED, 3, 2) & STRINGMID($SCOLOR_PICKED, 1, 2)
ELSE
$VRETURN = $SCOLOR_PICKED
ENDIF
IF ISARRAY($VRETURNTYPE) THEN
$VRETURNTYPE = __CHOOSECOLOR_STRUCTTOARRAY($TCC)
$VRETURNTYPE[0] = $VRETURN
RETURN $VRETURNTYPE
ENDIF
RETURN $VRETURN
ENDFUNC
FUNC __CHOOSECOLOR_STRUCTTOARRAY(BYREF $TSTRUCT)
LOCAL $AARRAY[17]
FOR $N = 1 TO 16
$AARRAY[$N] = DLLSTRUCTGETDATA($TSTRUCT, 1, $N)
NEXT
RETURN $AARRAY
ENDFUNC
FUNC _CHOOSEFONT($SFONTNAME = "Courier New", $IPOINTSIZE = 10, $IFONTCOLORREF = 0, $IFONTWEIGHT = 0, $BITALIC = FALSE, $BUNDERLINE = FALSE, $BSTRIKETHRU = FALSE, $HWNDOWNER = 0)
LOCAL $IITALIC = 0, $IUNDERLINE = 0, $ISTRIKEOUT = 0
$IFONTCOLORREF = BITOR(BITSHIFT(BITAND($IFONTCOLORREF, 255), -16), BITAND($IFONTCOLORREF, 65280), BITSHIFT(BITAND($IFONTCOLORREF, 16711680), 16))
LOCAL $HDC = __MISC_GETDC(0)
LOCAL $IHEIGHT = ROUND(($IPOINTSIZE * __MISC_GETDEVICECAPS($HDC, $LOGPIXELSX)) / 72, 0)
__MISC_RELEASEDC(0, $HDC)
LOCAL $TCHOOSEFONT = DLLSTRUCTCREATE($TAGCHOOSEFONT)
LOCAL $TLOGFONT = DLLSTRUCTCREATE($TAGLOGFONT)
DLLSTRUCTSETDATA($TCHOOSEFONT, "Size", DLLSTRUCTGETSIZE($TCHOOSEFONT))
DLLSTRUCTSETDATA($TCHOOSEFONT, "hWndOwner", $HWNDOWNER)
DLLSTRUCTSETDATA($TCHOOSEFONT, "LogFont", DLLSTRUCTGETPTR($TLOGFONT))
DLLSTRUCTSETDATA($TCHOOSEFONT, "PointSize", $IPOINTSIZE)
DLLSTRUCTSETDATA($TCHOOSEFONT, "Flags", BITOR($CF_SCREENFONTS, $CF_PRINTERFONTS, $CF_EFFECTS, $CF_INITTOLOGFONTSTRUCT, $CF_NOSCRIPTSEL))
DLLSTRUCTSETDATA($TCHOOSEFONT, "rgbColors", $IFONTCOLORREF)
DLLSTRUCTSETDATA($TCHOOSEFONT, "FontType", 0)
DLLSTRUCTSETDATA($TLOGFONT, "Height", $IHEIGHT)
DLLSTRUCTSETDATA($TLOGFONT, "Weight", $IFONTWEIGHT)
DLLSTRUCTSETDATA($TLOGFONT, "Italic", $BITALIC)
DLLSTRUCTSETDATA($TLOGFONT, "Underline", $BUNDERLINE)
DLLSTRUCTSETDATA($TLOGFONT, "Strikeout", $BSTRIKETHRU)
DLLSTRUCTSETDATA($TLOGFONT, "FaceName", $SFONTNAME)
LOCAL $ACALL = DLLCALL("comdlg32.dll", "bool", "ChooseFontW", "struct*", $TCHOOSEFONT)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, -1)
IF $ACALL[0] = 0 THEN RETURN SETERROR(-3, -3, -1)
LOCAL $SFACENAME = DLLSTRUCTGETDATA($TLOGFONT, "FaceName")
IF STRINGLEN($SFACENAME) = 0 AND STRINGLEN($SFONTNAME) > 0 THEN $SFACENAME = $SFONTNAME
IF DLLSTRUCTGETDATA($TLOGFONT, "Italic") THEN $IITALIC = 2
IF DLLSTRUCTGETDATA($TLOGFONT, "Underline") THEN $IUNDERLINE = 4
IF DLLSTRUCTGETDATA($TLOGFONT, "Strikeout") THEN $ISTRIKEOUT = 8
LOCAL $IATTRIBUTES = BITOR($IITALIC, $IUNDERLINE, $ISTRIKEOUT)
LOCAL $ISIZE = DLLSTRUCTGETDATA($TCHOOSEFONT, "PointSize") / 10
LOCAL $ICOLORREF = DLLSTRUCTGETDATA($TCHOOSEFONT, "rgbColors")
LOCAL $IWEIGHT = DLLSTRUCTGETDATA($TLOGFONT, "Weight")
LOCAL $SCOLOR_PICKED = HEX(STRING($ICOLORREF), 6)
RETURN STRINGSPLIT($IATTRIBUTES & "," & $SFACENAME & "," & $ISIZE & "," & $IWEIGHT & "," & $ICOLORREF & "," & "0x" & $SCOLOR_PICKED & "," & "0x" & STRINGMID($SCOLOR_PICKED, 5, 2) & STRINGMID($SCOLOR_PICKED, 3, 2) & STRINGMID($SCOLOR_PICKED, 1, 2), ",")
ENDFUNC
FUNC _CLIPPUTFILE($SFILEPATH, $SDELIMITER = "|")
LOCAL CONST $GMEM_MOVEABLE = 2, $CF_HDROP = 15
$SFILEPATH &= $SDELIMITER & $SDELIMITER
LOCAL $NGLOBMEMSIZE = 2 * (STRINGLEN($SFILEPATH) + 20)
LOCAL $ACALL = DLLCALL("user32.dll", "bool", "OpenClipboard", "hwnd", 0)
IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(@ERROR + 10, _WINAPI_GETLASTERROR(), FALSE)
LOCAL $IERROR = 0, $ILASTERROR = 0
$ACALL = DLLCALL("user32.dll", "bool", "EmptyClipboard")
IF @ERROR OR NOT $ACALL[0] THEN
$IERROR = @ERROR + 20
$ILASTERROR = _WINAPI_GETLASTERROR()
ELSE
$ACALL = DLLCALL("kernel32.dll", "handle", "GlobalAlloc", "uint", $GMEM_MOVEABLE, "ulong_ptr", $NGLOBMEMSIZE)
IF @ERROR OR NOT $ACALL[0] THEN
$IERROR = @ERROR + 30
$ILASTERROR = _WINAPI_GETLASTERROR()
ELSE
LOCAL $HGLOBAL = $ACALL[0]
$ACALL = DLLCALL("kernel32.dll", "ptr", "GlobalLock", "handle", $HGLOBAL)
IF @ERROR OR NOT $ACALL[0] THEN
$IERROR = @ERROR + 40
$ILASTERROR = _WINAPI_GETLASTERROR()
ELSE
LOCAL $HLOCK = $ACALL[0]
LOCAL $TDROPFILES = DLLSTRUCTCREATE("dword pFiles;" & $TAGPOINT & ";bool fNC;bool fWide;wchar[" & STRINGLEN($SFILEPATH) + 1 & "]", $HLOCK)
IF @ERROR THEN RETURN SETERROR(@ERROR + 50, 6, FALSE)
LOCAL $TSTRUCT = DLLSTRUCTCREATE("dword;long;long;bool;bool")
DLLSTRUCTSETDATA($TDROPFILES, "pFiles", DLLSTRUCTGETSIZE($TSTRUCT))
DLLSTRUCTSETDATA($TDROPFILES, "X", 0)
DLLSTRUCTSETDATA($TDROPFILES, "Y", 0)
DLLSTRUCTSETDATA($TDROPFILES, "fNC", 0)
DLLSTRUCTSETDATA($TDROPFILES, "fWide", 1)
DLLSTRUCTSETDATA($TDROPFILES, 6, $SFILEPATH)
FOR $I = 1 TO STRINGLEN($SFILEPATH)
IF DLLSTRUCTGETDATA($TDROPFILES, 6, $I) = $SDELIMITER THEN DLLSTRUCTSETDATA($TDROPFILES, 6, CHR(0), $I)
NEXT
$ACALL = DLLCALL("user32.dll", "handle", "SetClipboardData", "uint", $CF_HDROP, "handle", $HGLOBAL)
IF @ERROR OR NOT $ACALL[0] THEN
$IERROR = @ERROR + 60
$ILASTERROR = _WINAPI_GETLASTERROR()
ENDIF
$ACALL = DLLCALL("kernel32.dll", "bool", "GlobalUnlock", "handle", $HGLOBAL)
IF(@ERROR OR NOT $ACALL[0]) AND NOT $IERROR AND _WINAPI_GETLASTERROR() THEN
$IERROR = @ERROR + 80
$ILASTERROR = _WINAPI_GETLASTERROR()
ENDIF
ENDIF
$ACALL = DLLCALL("kernel32.dll", "ptr", "GlobalFree", "handle", $HGLOBAL)
IF(@ERROR OR $ACALL[0]) AND NOT $IERROR THEN
$IERROR = @ERROR + 90
$ILASTERROR = _WINAPI_GETLASTERROR()
ENDIF
ENDIF
ENDIF
$ACALL = DLLCALL("user32.dll", "bool", "CloseClipboard")
IF(@ERROR OR NOT $ACALL[0]) AND NOT $IERROR THEN RETURN SETERROR(@ERROR + 70, _WINAPI_GETLASTERROR(), FALSE)
IF $IERROR THEN RETURN SETERROR($IERROR, $ILASTERROR, FALSE)
RETURN TRUE
ENDFUNC
FUNC _MOUSETRAP($ILEFT = 0, $ITOP = 0, $IRIGHT = 0, $IBOTTOM = 0)
LOCAL $ACALL
IF $ILEFT = DEFAULT THEN $ILEFT = 0
IF $ITOP = DEFAULT THEN $ITOP = 0
IF $IRIGHT = DEFAULT THEN $IRIGHT = 0
IF $IBOTTOM = DEFAULT THEN $IBOTTOM = 0
IF @NUMPARAMS = 0 THEN
$ACALL = DLLCALL("user32.dll", "bool", "ClipCursor", "ptr", 0)
IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(1, _WINAPI_GETLASTERROR(), FALSE)
ELSE
IF @NUMPARAMS = 2 THEN
$IRIGHT = $ILEFT + 1
$IBOTTOM = $ITOP + 1
ENDIF
LOCAL $TRECT = DLLSTRUCTCREATE($TAGRECT)
DLLSTRUCTSETDATA($TRECT, "Left", $ILEFT)
DLLSTRUCTSETDATA($TRECT, "Top", $ITOP)
DLLSTRUCTSETDATA($TRECT, "Right", $IRIGHT)
DLLSTRUCTSETDATA($TRECT, "Bottom", $IBOTTOM)
$ACALL = DLLCALL("user32.dll", "bool", "ClipCursor", "struct*", $TRECT)
IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(2, _WINAPI_GETLASTERROR(), FALSE)
ENDIF
RETURN TRUE
ENDFUNC
FUNC _SINGLETON($SOCCURRENCENAME, $IFLAG = 0)
LOCAL CONST $ERROR_ALREADY_EXISTS = 183
LOCAL CONST $SECURITY_DESCRIPTOR_REVISION = 1
LOCAL $TSECURITYATTRIBUTES = 0
IF BITAND($IFLAG, 2) THEN
LOCAL $TSECURITYDESCRIPTOR = DLLSTRUCTCREATE("byte;byte;word;ptr[4]")
LOCAL $ACALL = DLLCALL("advapi32.dll", "bool", "InitializeSecurityDescriptor", "struct*", $TSECURITYDESCRIPTOR, "dword", $SECURITY_DESCRIPTOR_REVISION)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
IF $ACALL[0] THEN
$ACALL = DLLCALL("advapi32.dll", "bool", "SetSecurityDescriptorDacl", "struct*", $TSECURITYDESCRIPTOR, "bool", 1, "ptr", 0, "bool", 0)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
IF $ACALL[0] THEN
$TSECURITYATTRIBUTES = DLLSTRUCTCREATE($TAGSECURITY_ATTRIBUTES)
DLLSTRUCTSETDATA($TSECURITYATTRIBUTES, 1, DLLSTRUCTGETSIZE($TSECURITYATTRIBUTES))
DLLSTRUCTSETDATA($TSECURITYATTRIBUTES, 2, DLLSTRUCTGETPTR($TSECURITYDESCRIPTOR))
DLLSTRUCTSETDATA($TSECURITYATTRIBUTES, 3, 0)
ENDIF
ENDIF
ENDIF
LOCAL $AHANDLE = DLLCALL("kernel32.dll", "handle", "CreateMutexW", "struct*", $TSECURITYATTRIBUTES, "bool", 1, "wstr", $SOCCURRENCENAME)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
LOCAL $ALASTERROR = DLLCALL("kernel32.dll", "dword", "GetLastError")
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
IF $ALASTERROR[0] = $ERROR_ALREADY_EXISTS THEN
IF BITAND($IFLAG, 1) THEN
DLLCALL("kernel32.dll", "bool", "CloseHandle", "handle", $AHANDLE[0])
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
RETURN SETERROR($ALASTERROR[0], $ALASTERROR[0], 0)
ELSE
EXIT -1
ENDIF
ENDIF
RETURN $AHANDLE[0]
ENDFUNC
FUNC _ISPRESSED($SHEXKEY, $VDLL = "user32.dll")
LOCAL $ACALL = DLLCALL($VDLL, "short", "GetAsyncKeyState", "int", "0x" & $SHEXKEY)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
RETURN BITAND($ACALL[0], 32768) <> 0
ENDFUNC
FUNC _VERSIONCOMPARE($SVERSION1, $SVERSION2)
IF $SVERSION1 = $SVERSION2 THEN RETURN 0
LOCAL $SSUBVERSION1 = "", $SSUBVERSION2 = ""
IF STRINGISALPHA(STRINGRIGHT($SVERSION1, 1)) THEN
$SSUBVERSION1 = STRINGRIGHT($SVERSION1, 1)
$SVERSION1 = STRINGTRIMRIGHT($SVERSION1, 1)
ENDIF
IF STRINGISALPHA(STRINGRIGHT($SVERSION2, 1)) THEN
$SSUBVERSION2 = STRINGRIGHT($SVERSION2, 1)
$SVERSION2 = STRINGTRIMRIGHT($SVERSION2, 1)
ENDIF
LOCAL $AVERSION1 = STRINGSPLIT($SVERSION1, ".,"), $AVERSION2 = STRINGSPLIT($SVERSION2, ".,")
LOCAL $IPARTDIFFERENCE = ($AVERSION1[0] - $AVERSION2[0])
IF $IPARTDIFFERENCE < 0 THEN
REDIM $AVERSION1[UBOUND($AVERSION2)]
$AVERSION1[0] = UBOUND($AVERSION1) - 1
FOR $I = (UBOUND($AVERSION1) - ABS($IPARTDIFFERENCE)) TO $AVERSION1[0]
$AVERSION1[$I] = "0"
NEXT
ELSEIF $IPARTDIFFERENCE > 0 THEN
REDIM $AVERSION2[UBOUND($AVERSION1)]
$AVERSION2[0] = UBOUND($AVERSION2) - 1
FOR $I = (UBOUND($AVERSION2) - ABS($IPARTDIFFERENCE)) TO $AVERSION2[0]
$AVERSION2[$I] = "0"
NEXT
ENDIF
FOR $I = 1 TO $AVERSION1[0]
IF STRINGISDIGIT($AVERSION1[$I]) AND STRINGISDIGIT($AVERSION2[$I]) THEN
IF NUMBER($AVERSION1[$I]) > NUMBER($AVERSION2[$I]) THEN
RETURN SETEXTENDED(2, 1)
ELSEIF NUMBER($AVERSION1[$I]) < NUMBER($AVERSION2[$I]) THEN
RETURN SETEXTENDED(2, -1)
ELSEIF $I = $AVERSION1[0] THEN
IF $SSUBVERSION1 > $SSUBVERSION2 THEN
RETURN SETEXTENDED(3, 1)
ELSEIF $SSUBVERSION1 < $SSUBVERSION2 THEN
RETURN SETEXTENDED(3, -1)
ENDIF
ENDIF
ELSE
IF $AVERSION1[$I] > $AVERSION2[$I] THEN
RETURN SETEXTENDED(1, 1)
ELSEIF $AVERSION1[$I] < $AVERSION2[$I] THEN
RETURN SETEXTENDED(1, -1)
ENDIF
ENDIF
NEXT
RETURN SETEXTENDED(ABS($IPARTDIFFERENCE), 0)
ENDFUNC
FUNC __MISC_GETDC($HWND)
LOCAL $ACALL = DLLCALL("user32.dll", "handle", "GetDC", "hwnd", $HWND)
IF @ERROR OR NOT $ACALL[0] THEN RETURN SETERROR(1, _WINAPI_GETLASTERROR(), 0)
RETURN $ACALL[0]
ENDFUNC
FUNC __MISC_GETDEVICECAPS($HDC, $IINDEX)
LOCAL $ACALL = DLLCALL("gdi32.dll", "int", "GetDeviceCaps", "handle", $HDC, "int", $IINDEX)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
RETURN $ACALL[0]
ENDFUNC
FUNC __MISC_RELEASEDC($HWND, $HDC)
LOCAL $ACALL = DLLCALL("user32.dll", "int", "ReleaseDC", "hwnd", $HWND, "handle", $HDC)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, FALSE)
RETURN $ACALL[0] <> 0
ENDFUNC
GLOBAL $VER_MAJOR = "50"
GLOBAL $VER_MINOR = "0"
GLOBAL $VER_REV = "0"
GLOBAL $HEU_VER = $VER_MAJOR & "." & $VER_MINOR & "." & $VER_REV
GLOBAL $HEU_MSGBOX = "HEU KMS Activator " & $HEU_VER
GLOBAL $HEU_KMS = "HKA"
GLOBAL $KMSHOST, $KMSPORT
GLOBAL $SCRIPTDIR = INIREAD(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Dir", "")
GLOBAL $SCRIPTNAME = INIREAD(@TEMPDIR & "\ScriptTemp.ini", "HEUDirection", "Name", "")
GLOBAL $TEMPFOLDER = INIREAD($SCRIPTDIR & "\Set.ini", "Tempfolder", "temp", "")
LOCAL $AARRAY_ENV = STRINGREGEXP($TEMPFOLDER, "%([^%]*?)%", 3)
IF ISARRAY($AARRAY_ENV) THEN
LOCAL $TEMPFOLDER_ENV = STRINGREPLACE(ENVGET($AARRAY_ENV[0]), "\", "\\")
$TEMPFOLDER = STRINGREGEXPREPLACE($TEMPFOLDER, "%([^%]*?)%", $TEMPFOLDER_ENV)
ENDIF
IF FILEEXISTS($TEMPFOLDER) = 1 THEN
$FILEINSTDIR = $TEMPFOLDER & "\" & "_temp_heu168yyds"
ELSE
$FILEINSTDIR = @TEMPDIR & "\" & "_temp_heu168yyds"
ENDIF
GLOBAL $HEU_DEBUG_TXT = "HEU" & $VER_MAJOR & $VER_MINOR & $VER_REV & "_Debug.txt"
GLOBAL $HEU_DEBUG = @TEMPDIR & "\" & $HEU_DEBUG_TXT
GLOBAL $HEU_DEBUG_SET
GLOBAL $LOGINST = INIREAD($SCRIPTDIR & "\Set.ini", "LogInst", "log", "")
IF FILEEXISTS($LOGINST) = 1 THEN
$HEU_DEBUG = $LOGINST & "\" & $HEU_DEBUG_TXT
ENDIF
GLOBAL $SETENV = 'set "Path=%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\System32\Wbem;%SystemRoot\System32\WindowsPowerShell\v1.0\"'
GLOBAL $SYSPATH = @WINDOWSDIR & "\System32"
IF FILEEXISTS(@WINDOWSDIR & "\Sysnative\cmd.exe") THEN
$SYSPATH = @WINDOWSDIR & "\Sysnative"
$SETENV = 'set "Path=%SystemRoot%;%SystemRoot%\Sysnative;%SystemRoot%\Sysnative\Wbem;%SystemRoot\Sysnative\WindowsPowerShell\v1.0\;%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\System32\Wbem;%SystemRoot\System32\WindowsPowerShell\v1.0\"'
ENDIF
GLOBAL $CSCRIPT = $SYSPATH & "\cscript.exe"
GLOBAL $WMI_REP = $FILEINSTDIR & "\xml\wim.xml"
GLOBAL $USERAGREEMENT = "NO"
GLOBAL $OSARCH
IF @OSARCH = "X86" THEN
$OSARCH = "x86"
ELSE
LOCAL $PROCESSOR_ARCH = REGREAD("HKLM64\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PROCESSOR_ARCHITECTURE")
IF @OSARCH = "X64" THEN $OSARCH = "x64"
IF $PROCESSOR_ARCH = "AMD64" THEN $OSARCH = "x64"
IF $PROCESSOR_ARCH = "ARM64" THEN $OSARCH = "ARM64"
IF FILEEXISTS(@WINDOWSDIR & "\SysArm32\cmd.exe") THEN $OSARCH = "ARM64"
ENDIF
IF STRINGINSTR("0804 1004 1404 0004", @OSLANG) THEN
GLOBAL $STATEMENT[5] = ["【免责声明】", "(1)本软件仅用于学习和研究Windows和Office的激活原理使用。如果使用Windows和Office,请前往微软正规渠道购买正版授权。", "(2)本软件完全免费,任何人不得用于商业用途,且下载后请务必于24小时内删除。任何违规使用造成的法律后果与本人无关。", "如果是付费获得,那么你肯定被骗了!!!", "务必接受上述条款才可继续使用,是否接受?"]
GLOBAL $ERRORHELP[10] = ["WPA注册表错误,请在WinPE/WinRE下修复", "注册表删除成功", "文件删除成功", "注册表删除失败", "文件删除失败"]
ELSEIF STRINGINSTR("0404 0c04 7C04", @OSLANG) THEN
GLOBAL $STATEMENT[5] = ["【免責聲明】", "(1)本軟件僅用於學習和研究Windows和Office的激活原理使用。如果使用Windows和Office,請前往微軟正規渠道購買正版授權。 ", "(2)本軟件完全免費,任何人不得用於商業用途,且下載後請務必於24小時內刪除。任何違規使用造成的法律后果與本人無關。", "如果是付費獲得,那麼你肯定被騙了!!! ", "務必接受上述條款才可繼續使用,是否接受? "]
ELSE
GLOBAL $STATEMENT[5] = ["[Disclaimer]", "(1) This software is only used to learn and study the activation principles of Windows and Office. If you use Windows and Office, please go to the official Microsoft channels to purchase genuine licenses. ", " (2) This software is completely free, no one can use it for commercial purposes, and it must be deleted within 24 hours after downloading.Any legal sanctions caused by illegal use have nothing to do with me.", "If it is paid for, then you must have been cheated. ", "You must accept the above terms before you can continue to use it. Do you accept it? "]
ENDIF
GLOBAL $SLENIPARAMETER[3] = ["/?" & @TAB & "查看静默参数" & @CRLF & "" & "/smart" & @TAB & "智能激活" & @CRLF & "" & "/dig" & @TAB & "数字许可证激活Win10/11" & @CRLF & "" & "/k38" & @TAB & "激活Win10/11至2038年" & @CRLF & "" & "/lok" & @TAB & "添加KMS38保护" & @CRLF & "" & "/wts" & @TAB & "TSForge激活Windows(永久)" & @CRLF & "" & "/ots" & @TAB & "TSForge激活Office(永久)" & @CRLF & "" & "/oem" & @TAB & "OEM激活Win Vista/7/Server" & @CRLF & "" & "/od1" & @TAB & "OEM模式1(默认)" & @CRLF & "" & "/od2" & @TAB & "OEM模式2" & @CRLF & "" & "/kwi" & @TAB & "使用KMS激活Windows(180天)" & @CRLF & "" & "/kof" & @TAB & "使用KMS激活Office(180天)" & @CRLF & "" & "/ohk" & @TAB & "使用Ohook激活Office(永久)" & @CRLF & "" & "/kd1" & @TAB & "KMS模式1(默认)" & @CRLF & "" & "/kd2" & @TAB & "KMS模式2" & @CRLF & "" & "/wxp" & @TAB & "激活Windows XP" & @CRLF & "" & "/r2v" & @TAB & "Office Retail转化成Volume" & @CRLF & "" & "/ren" & @TAB & "安装自动续期功能" & @CRLF & "" & "/unr" & @TAB & "卸载自动续期功能" & @CRLF & "" & "/reb" & @TAB & "重启计算机" & @CRLF & "" & "/nologo" & @TAB & "使用静默参数时不显示logo", "/?" & @TAB & "查看靜默參數" & @CRLF & "" & "/smart" & @TAB & "智能激活" & @CRLF & "" & "/dig" & @TAB & "數字許可證激活Win10/11" & @CRLF & "" & "/k38" & @TAB & "激活Win10/11至2038年" & @CRLF & "" & "/lok" & @TAB & "添加KMS38保護" & @CRLF & "" & "/wts" & @TAB & "TSForge激活Windows(永久)" & @CRLF & "" & "/ots" & @TAB & "TSForge激活Office(永久)" & @CRLF & "" & "/oem" & @TAB & "OEM激活Win Vista/7/Server" & @CRLF & "" & "/od1" & @TAB & "OEM模式1(預設)" & @CRLF & "" & "/od2" & @TAB & "OEM模式2" & @CRLF & "" & "/kwi" & @TAB & "使用KMS激活Windows(180天)" & @CRLF & "" & "/kof" & @TAB & "使用KMS激活Office(180天)" & @CRLF & "" & "/ohk" & @TAB & "使用Ohook激活Office(永久)" & @CRLF & "" & "/kd1" & @TAB & "KMS模式1(預設)" & @CRLF & "" & "/kd2" & @TAB & "KMS模式2" & @CRLF & "" & "/wxp" & @TAB & "激活Windows XP" & @CRLF & "" & "/r2v" & @TAB & "Office Retail轉化成Volume" & @CRLF & "" & "/ren" & @TAB & "安裝自動續期功能" & @CRLF & "" & "/unr" & @TAB & "卸載自動續期功能" & @CRLF & "" & "/reb " & @TAB & "重啟計算機" & @CRLF & "" & "/nologo" & @TAB & "使用靜默參數時不顯示logo", "/?" & @TAB & "View the silent parameter" & @CRLF & "" & "/smart" & @TAB & "Smart activation" & @CRLF & "" & "/dig" & @TAB & "Digital license to activate Win10/11" & @CRLF & "" & "/k38" & @TAB & "Activate Win10/11 until 2038" & @CRLF & "" & "/lok" & @TAB & "Add KMS38 protection" & @CRLF & "" & "/wts" & @TAB & "Activate Windows with TSForge(Permantent)" & @CRLF & "" & "/ots" & @TAB & "Activate Office with TSForge(Permantent)" & @CRLF & "" & "/oem" & @TAB & "OEM activate Win Vista/7/Server" & @CRLF & "" & "/od1" & @TAB & "OEM mode 1(default)" & @CRLF & "" & "/od2" & @TAB & "OEM mode 2" & @CRLF & "" & "/kwi" & @TAB & "Activate Windows with KMS(180 days)" & @CRLF & "" & "/kof" & @TAB & "Activate Office with KMS(180 days)" & @CRLF & "" & "/ohk" & @TAB & "Activate Office with Ohook(Permantent)" & @CRLF & "" & "/kd1" & @TAB & "KMS mode 1(default)" & @CRLF & "" & "/kd2" & @TAB & "KMS mode 2" & @CRLF & "" & "/wxp" & @TAB & "Activate Windows XP" & @CRLF & "" & "/r2v" & @TAB & "Office Retail to Volume" & @CRLF & "" & "/ren" & @TAB & "Install KMS Renewal" & @CRLF & "" & "/unr" & @TAB & "Uninstall KMS Renewal" & @CRLF & "" & "/reb" & @TAB & "Reboot Computer" & @CRLF & "" & "/nologo" & @TAB & "Not display logo of this software"]
FUNC _RUN_BAT_GET_ECHO($COMMAND)
LOCAL $IPID = RUN(@COMSPEC & " /c " & $COMMAND, @SCRIPTDIR, @SW_HIDE, 8)
IF @ERROR = 0 THEN
PROCESSWAITCLOSE($IPID)
LOCAL $RESULT = BINARYTOSTRING(STDOUTREAD($IPID, 1, 1))
RETURN $RESULT
ENDIF
ENDFUNC
FUNC _RUN_BAT_GET_ECHO_WS($COMMAND)
LOCAL $IPID = RUN(@COMSPEC & " /c " & $COMMAND & " 4>nul 3>nul 2>nul >nul && echo=1||echo=-1", @SCRIPTDIR, @SW_HIDE, 8)
IF @ERROR = 0 THEN
PROCESSWAITCLOSE($IPID)
LOCAL $RESULT = BINARYTOSTRING(STDOUTREAD($IPID, 1, 1))
IF $RESULT = 1 THEN
RETURN 1
ELSE
RETURN -1
ENDIF
ELSE
RETURN -2
ENDIF
ENDFUNC
FUNC _ERR_RUN_BAT($A, $B)
LOCAL $ERR = _RUN_BAT_GET_ECHO($A)
LOCAL $ERROR
IF $ERR = 0 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] " & $B)
RETURN "succeed"
ELSE
$ERROR = "0x" & HEX($ERR)
_FILEWRITEDEBUG($HEU_DEBUG, "[" & $ERROR & "] " & $B)
RETURN $ERROR
ENDIF
ENDFUNC
FUNC _CMD_RUN_BAT($A, $B = "")
LOCAL $RE = _RUN_BAT_GET_ECHO($A)
IF $B = "" THEN
_FILEWRITEDEBUG($HEU_DEBUG, $RE)
ELSE
_FILEWRITEDEBUG($HEU_DEBUG, $B & ":" & $RE)
ENDIF
RETURN $RE
ENDFUNC
FUNC _REDUCEMEMORY($I_PID = -1)
IF $I_PID <> -1 THEN
LOCAL $AI_HANDLE = DLLCALL("kernel32.dll", "int", "OpenProcess", "int", 2035711, "int", FALSE, "int", $I_PID)
LOCAL $AI_RETURN = DLLCALL("psapi.dll", "int", "EmptyWorkingSet", "long", $AI_HANDLE[0])
DLLCALL("kernel32.dll", "int", "CloseHandle", "int", $AI_HANDLE[0])
ELSE
LOCAL $AI_RETURN = DLLCALL("psapi.dll", "int", "EmptyWorkingSet", "long", -1)
ENDIF
RETURN $AI_RETURN[0]
ENDFUNC
FUNC _FILEFINDALL($SDIR, BYREF $SOUT)
LOCAL $HSEARCH = FILEFINDFIRSTFILE($SDIR & "\*.*")
IF $HSEARCH = -1 THEN RETURN
WHILE 1
LOCAL $SFILE = FILEFINDNEXTFILE($HSEARCH)
IF @ERROR THEN EXITLOOP
IF @EXTENDED THEN CONTINUELOOP _FILEFINDALL($SDIR & "\" & $SFILE, $SOUT)
$SOUT &= $SDIR & "\" & $SFILE & @CRLF
WEND
FILECLOSE($HSEARCH)
RETURN $SOUT
ENDFUNC
FUNC _DEFINEWMISPP()
LOCAL $WINMGMTCHECK = _RUN_BAT_GET_ECHO($CSCRIPT & ' //nologo //Job:WmiQuery "' & $WMI_REP & '?.wsf" ' & "Win32_ComputerSystem" & " CreationClassName")
LOCAL $SPPCHECK = _RUN_BAT_GET_ECHO($CSCRIPT & ' //nologo //Job:WmiQuery "' & $WMI_REP & '?.wsf" ' & "SoftwareLicensingService" & " Version")
IF STRINGINSTR($WINMGMTCHECK, "ComputerSystem") <> 0 THEN
$WMI_WINMGMT = 1
ELSE
$WMI_WINMGMT = 0
_FILEWRITEDEBUG($HEU_DEBUG, "WinMgmt [No Response]")
ENDIF
LOCAL $AARRAY_SPP = STRINGREGEXP($SPPCHECK, "\d+\.\d+\.\d+\.\d+", 3)
IF ISARRAY($AARRAY_SPP) THEN
$WMI_SPPSVC = 1
ELSE
$WMI_SPPSVC = 0
_FILEWRITEDEBUG($HEU_DEBUG, "SPPSVC [No Response]")
ENDIF
ENDFUNC
FUNC _DATE_TIME()
LOCAL $_DATE_TIME
$_DATE_TIME = @CRLF & ">>[" & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "] "
RETURN $_DATE_TIME
ENDFUNC
FUNC _FILEWRITEDEBUG($A, $B)
FILEWRITE($A, _DATE_TIME())
FILEWRITE($A, $B)
ENDFUNC
FUNC _SILENT_PARAMETERS()
LOCAL $LANGUAGE = INIREAD($SCRIPTDIR & "\Set.ini", "Language", "lang", "")
IF $LANGUAGE = "SimplyChinese" OR $LANGUAGE = "TraditionalChinese" OR $LANGUAGE = "English" THEN
_SILENT_PARAMETERS_MSGBOX($LANGUAGE)
ELSEIF STRINGINSTR("0804 1004 1404 0004", @OSLANG) THEN
_SILENT_PARAMETERS_MSGBOX("SimplyChinese")
ELSEIF STRINGINSTR("0404 0c04 7C04", @OSLANG) THEN
_SILENT_PARAMETERS_MSGBOX("TraditionalChinese")
ELSE
_SILENT_PARAMETERS_MSGBOX("English")
ENDIF
ENDFUNC
FUNC _SILENT_PARAMETERS_MSGBOX($A)
IF $A = "SimplyChinese" THEN
MSGBOX(262144 + 64, "静默参数", $SLENIPARAMETER[0])
ELSEIF $A = "TraditionalChinese" THEN
MSGBOX(262144 + 64, "靜默參數", $SLENIPARAMETER[1])
ELSE
MSGBOX(262144 + 64, "silent parameter", $SLENIPARAMETER[2])
ENDIF
ENDFUNC
FUNC _RESULT_TIPS($A)
IF $A = 1 THEN
RETURN "[Succeed]"
ELSE
RETURN "[Failed]"
ENDIF
ENDFUNC
FUNC _REGDELETE($A, $B = "")
LOCAL $RE
IF $B = "" THEN
$RE = REGDELETE($A)
ELSE
$RE = REGDELETE($A, $B)
ENDIF
IF $RE = 1 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Delete registry key " & $A & " " & $B)
ENDIF
IF $RE = 0 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Not exist registry key] " & $A & " " & $B)
ENDIF
IF $RE = 2 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Delete registry key " & $A & " " & $B)
ENDIF
RETURN $RE
ENDFUNC
FUNC _REGWRITE($A, $B, $C, $D)
LOCAL $RE
$RE = REGWRITE($A, $B, $C, $D)
IF $RE = 1 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Write registry key " & $A & "," & $B & "," & $D)
ENDIF
IF $RE = 0 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Write registry key " & $A & "," & $B & "," & $D)
ENDIF
RETURN $RE
ENDFUNC
FUNC _REGREAD($A, $B)
LOCAL $RE
$RE = REGREAD($A, $B)
IF @ERROR = 0 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Read registry " & $A & "," & $B & " = " & $RE)
ELSE
_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Read registry " & $A & "," & $B & " = " & $RE)
ENDIF
RETURN $RE
ENDFUNC
FUNC _FILECOPY($A, $B, $C = 0)
LOCAL $RE = FILECOPY($A, $B, $C)
IF $RE = 1 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Copy " & $A & " to " & $B)
ELSE
_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] Copy " & $A & " to " & $B)
ENDIF
RETURN $RE
ENDFUNC
FUNC _FILEDELETE($A)
LOCAL $RE = FILEDELETE($A)
IF $RE = 1 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Delete " & $A)
ELSE
_FILEWRITEDEBUG($HEU_DEBUG, "[Failed or Not Exist] Delete " & $A)
ENDIF
RETURN $RE
ENDFUNC
FUNC _DIRREMOVE($A, $B = 1)
LOCAL $RE = DIRREMOVE($A, $B)
IF $RE = 1 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] Remove " & $A)
ELSE
_FILEWRITEDEBUG($HEU_DEBUG, "[Failed or Not Exist] Remove " & $A)
ENDIF
RETURN $RE
ENDFUNC
FUNC _REGENUMKEY($REGPATH, $KEY = "")
GLOBAL $REGENUMKEY = ""
LOCAL $RE = ""
_REKEY($REGPATH, $KEY)
$RE = $REGENUMKEY
$REGENUMKEY = ""
RETURN $RE
ENDFUNC
FUNC _REKEY($REGPATH, $KEY = "")
LOCAL $I = 1
WHILE TRUE
LOCAL $KEYNAME = REGENUMKEY($REGPATH, $I)
IF @ERROR THEN EXITLOOP
IF $KEY <> "" THEN
IF STRINGINSTR($KEYNAME, $KEY) THEN
$REGENUMKEY &= " " & $KEYNAME
ENDIF
ELSE
$REGENUMKEY &= " " & $KEYNAME
ENDIF
IF STRINGLEFT($REGENUMKEY, 1) = " " THEN $REGENUMKEY = STRINGTRIMLEFT($REGENUMKEY, 1)
_REKEY($REGPATH & "\" & $KEYNAME, $KEY)
$I += 1
WEND
ENDFUNC
FUNC _CHANGEMD5($FILE)
LOCAL $HFILEOPEN, $RE
LOCAL $CONTENT = " " & @YEAR & @MON & @YDAY & @HOUR & @MIN & @SEC & @MSEC
$HFILEOPEN = FILEOPEN($FILE, 1)
$RE = FILEWRITE($HFILEOPEN, $CONTENT)
FILECLOSE($HFILEOPEN)
IF $RE = 1 THEN
_FILEWRITEDEBUG($HEU_DEBUG, "[Succeed] to Change Hash:" & $FILE)
ELSE
_FILEWRITEDEBUG($HEU_DEBUG, "[Failed] to Change Hash:" & $FILE)
ENDIF
ENDFUNC
FUNC _FIXWPA()
LOCAL $WINPE = 0, $MINNT = "", $PARTITION, $SSUBKEY, $DELREG, $DELFILE, $RE
IF $OSARCH = "x64" OR $OSARCH = "ARM64" THEN
$REGHKLM = "HKLM64"
ELSE
$REGHKLM = "HKLM"
ENDIF
REGREAD($REGHKLM & "\Software\Microsoft\Windows NT\CurrentVersion\WinPE", "")
IF @ERROR <> 1 AND @ERROR <> 2 THEN
$WINPE = 1
ELSE
$MINNT = REGREAD($REGHKLM & "\SYSTEM\CurrentControlSet\Control", "SystemStartOptions")
IF STRINGINSTR($MINNT, "MINNT") <> 0 THEN
$WINPE = 1
ENDIF
ENDIF
IF $WINPE = 1 THEN
LOCAL $AARRAY
$PARTITION = _CMD_RUN_BAT($SYSPATH & '\bcdedit | find "osdevice"')
$AARRAY = STRINGREGEXP($PARTITION, "=(\S*)", 3)
IF ISARRAY($AARRAY) THEN $PARTITION = $AARRAY[0]
_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\system32\config\SYSTEM"')
REGREAD($REGHKLM & "\clean_temp\ControlSet001\Control\{7746D80F-97E0-4E26-9543-26B41FC22F79}", "")
IF @ERROR <> 1 AND @ERROR <> 2 THEN
$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\ControlSet001\Control\{7746D80F-97E0-4E26-9543-26B41FC22F79}")
ENDIF
FOR $I = 1 TO 1000
$SSUBKEY = REGENUMKEY($REGHKLM & "\clean_temp\WPA", $I)
IF @ERROR THEN EXITLOOP
IF STRINGINSTR($SSUBKEY, "8DEC0AF1-0341-4b93-85CD-72606C2DF94C") <> 0 THEN
$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\WPA\" & $SSUBKEY)
ENDIF
NEXT
_CMD_RUN_BAT("reg unload HKLM\clean_temp")
_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\system32\config\DEFAULT"')
REGREAD($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL", "")
IF @ERROR <> 1 AND @ERROR <> 2 THEN
$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL")
ENDIF
_CMD_RUN_BAT("reg unload HKLM\clean_temp")
_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\ServiceProfiles\LocalService\NTUSER.DAT"')
REGREAD($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL", "")
IF @ERROR <> 1 AND @ERROR <> 2 THEN
$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL")
ENDIF
_CMD_RUN_BAT("reg unload HKLM\clean_temp")
_CMD_RUN_BAT('reg load HKLM\clean_temp "' & $PARTITION & '\Windows\ServiceProfiles\NetworkService\NTUSER.DAT"')
REGREAD($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL", "")
IF @ERROR <> 1 AND @ERROR <> 2 THEN
$DELREG &= _REGDELETE($REGHKLM & "\clean_temp\Software\Microsoft\IdentityCRL")
ENDIF
_CMD_RUN_BAT("reg unload HKLM\clean_temp")
IF FILEEXISTS($PARTITION & "\Windows\System32\spp\store_test\2.0") THEN
$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\System32\spp\store_test\2.0\cache", 1)
$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store_test\2.0\data.dat")
$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store_test\2.0\tokens.dat")
ENDIF
IF FILEEXISTS($PARTITION & "\Windows\System32\spp\store\2.0") THEN
$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\System32\spp\store\2.0\cache", 1)
$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\2.0\data.dat")
$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\2.0\tokens.dat")
ENDIF
IF FILEEXISTS($PARTITION & "\Windows\System32\spp\store") THEN
$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\System32\spp\store\cache", 1)
$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\data.dat")
$DELFILE &= _FILEDELETE($PARTITION & "\Windows\System32\spp\store\tokens.dat")
ENDIF
IF FILEEXISTS($PARTITION & "\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareProtectionPlatform") THEN
$DELFILE &= _DIRREMOVE($PARTITION & "\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareProtectionPlatform\cache", 1)
$DELFILE &= _FILEDELETE($PARTITION & "\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\SoftwareProtectionPlatform\tokens.dat")
ENDIF
ELSE
_FILEWRITEDEBUG($HEU_DEBUG, "Not Detcted WinPE")
ENDIF
IF STRINGINSTR($DELREG, "2") <> 0 THEN
$RE &= $ERRORHELP[3] & @CRLF
ELSE
$RE &= $ERRORHELP[1] & @CRLF
ENDIF
IF STRINGINSTR($DELFILE, "0") <> 0 THEN
$RE &= $ERRORHELP[4] & @CRLF
ELSE
$RE &= $ERRORHELP[2] & @CRLF
ENDIF
MSGBOX(64, $HEU_MSGBOX, $RE)
ENDFUNC
GLOBAL CONST $GUI_EVENT_SINGLE = 0
GLOBAL CONST $GUI_EVENT_ARRAY = 1
GLOBAL CONST $GUI_EVENT_NONE = 0
GLOBAL CONST $GUI_EVENT_CLOSE = -3
GLOBAL CONST $GUI_EVENT_MINIMIZE = -4
GLOBAL CONST $GUI_EVENT_RESTORE = -5
GLOBAL CONST $GUI_EVENT_MAXIMIZE = -6
GLOBAL CONST $GUI_EVENT_PRIMARYDOWN = -7
GLOBAL CONST $GUI_EVENT_PRIMARYUP = -8
GLOBAL CONST $GUI_EVENT_SECONDARYDOWN = -9
GLOBAL CONST $GUI_EVENT_SECONDARYUP = -10
GLOBAL CONST $GUI_EVENT_MOUSEMOVE = -11
GLOBAL CONST $GUI_EVENT_RESIZED = -12
GLOBAL CONST $GUI_EVENT_DROPPED = -13
GLOBAL CONST $GUI_RUNDEFMSG = "GUI_RUNDEFMSG"
GLOBAL CONST $GUI_AVISTOP = 0
GLOBAL CONST $GUI_AVISTART = 1
GLOBAL CONST $GUI_AVICLOSE = 2
GLOBAL CONST $GUI_CHECKED = 1
GLOBAL CONST $GUI_INDETERMINATE = 2
GLOBAL CONST $GUI_UNCHECKED = 4
GLOBAL CONST $GUI_DROPACCEPTED = 8
GLOBAL CONST $GUI_NODROPACCEPTED = 4096
GLOBAL CONST $GUI_ACCEPTFILES = $GUI_DROPACCEPTED
GLOBAL CONST $GUI_SHOW = 16
GLOBAL CONST $GUI_HIDE = 32
GLOBAL CONST $GUI_ENABLE = 64
GLOBAL CONST $GUI_DISABLE = 128
GLOBAL CONST $GUI_FOCUS = 256
GLOBAL CONST $GUI_NOFOCUS = 8192
GLOBAL CONST $GUI_DEFBUTTON = 512
GLOBAL CONST $GUI_EXPAND = 1024
GLOBAL CONST $GUI_ONTOP = 2048
GLOBAL CONST $GUI_FONTNORMAL = 0
GLOBAL CONST $GUI_FONTITALIC = 2
GLOBAL CONST $GUI_FONTUNDER = 4
GLOBAL CONST $GUI_FONTSTRIKE = 8
GLOBAL CONST $GUI_DOCKAUTO = 1
GLOBAL CONST $GUI_DOCKLEFT = 2
GLOBAL CONST $GUI_DOCKRIGHT = 4
GLOBAL CONST $GUI_DOCKHCENTER = 8
GLOBAL CONST $GUI_DOCKTOP = 32
GLOBAL CONST $GUI_DOCKBOTTOM = 64
GLOBAL CONST $GUI_DOCKVCENTER = 128
GLOBAL CONST $GUI_DOCKWIDTH = 256
GLOBAL CONST $GUI_DOCKHEIGHT = 512
GLOBAL CONST $GUI_DOCKSIZE = 768
GLOBAL CONST $GUI_DOCKMENUBAR = 544
GLOBAL CONST $GUI_DOCKSTATEBAR = 576
GLOBAL CONST $GUI_DOCKALL = 802
GLOBAL CONST $GUI_DOCKBORDERS = 102
GLOBAL CONST $GUI_GR_CLOSE = 1
GLOBAL CONST $GUI_GR_LINE = 2
GLOBAL CONST $GUI_GR_BEZIER = 4
GLOBAL CONST $GUI_GR_MOVE = 6
GLOBAL CONST $GUI_GR_COLOR = 8
GLOBAL CONST $GUI_GR_RECT = 10
GLOBAL CONST $GUI_GR_ELLIPSE = 12
GLOBAL CONST $GUI_GR_PIE = 14
GLOBAL CONST $GUI_GR_DOT = 16
GLOBAL CONST $GUI_GR_PIXEL = 18
GLOBAL CONST $GUI_GR_HINT = 20
GLOBAL CONST $GUI_GR_REFRESH = 22
GLOBAL CONST $GUI_GR_PENSIZE = 24
GLOBAL CONST $GUI_GR_NOBKCOLOR = -2
GLOBAL CONST $GUI_BKCOLOR_DEFAULT = -1
GLOBAL CONST $GUI_BKCOLOR_TRANSPARENT = -2
GLOBAL CONST $GUI_BKCOLOR_LV_ALTERNATE = -33554432
GLOBAL CONST $GUI_READ_DEFAULT = 0
GLOBAL CONST $GUI_READ_EXTENDED = 1
GLOBAL CONST $GUI_CURSOR_NOOVERRIDE = 0
GLOBAL CONST $GUI_CURSOR_OVERRIDE = 1
GLOBAL CONST $GUI_WS_EX_PARENTDRAG = 1048576
GLOBAL CONST $WC_ANIMATE = "SysAnimate32"
GLOBAL CONST $WC_BUTTON = "Button"
GLOBAL CONST $WC_COMBOBOX = "ComboBox"
GLOBAL CONST $WC_COMBOBOXEX = "ComboBoxEx32"
GLOBAL CONST $WC_DATETIMEPICK = "SysDateTimePick32"
GLOBAL CONST $WC_EDIT = "Edit"
GLOBAL CONST $WC_HEADER = "SysHeader32"
GLOBAL CONST $WC_HOTKEY = "msctls_hotkey32"
GLOBAL CONST $WC_IPADDRESS = "SysIPAddress32"
GLOBAL CONST $WC_LINK = "SysLink"
GLOBAL CONST $WC_LISTBOX = "ListBox"
GLOBAL CONST $WC_LISTVIEW = "SysListView32"
GLOBAL CONST $WC_MONTHCAL = "SysMonthCal32"
GLOBAL CONST $WC_NATIVEFONTCTL = "NativeFontCtl"
GLOBAL CONST $WC_PAGESCROLLER = "SysPager"
GLOBAL CONST $WC_PROGRESS = "msctls_progress32"
GLOBAL CONST $WC_REBAR = "ReBarWindow32"
GLOBAL CONST $WC_SCROLLBAR = "ScrollBar"
GLOBAL CONST $WC_STATIC = "Static"
GLOBAL CONST $WC_STATUSBAR = "msctls_statusbar32"
GLOBAL CONST $WC_TABCONTROL = "SysTabControl32"
GLOBAL CONST $WC_TOOLBAR = "ToolbarWindow32"
GLOBAL CONST $WC_TOOLTIPS = "tooltips_class32"
GLOBAL CONST $WC_TRACKBAR = "msctls_trackbar32"
GLOBAL CONST $WC_TREEVIEW = "SysTreeView32"
GLOBAL CONST $WC_UPDOWN = "msctls_updown32"
GLOBAL CONST $WS_OVERLAPPED = 0
GLOBAL CONST $WS_TILED = $WS_OVERLAPPED
GLOBAL CONST $WS_MAXIMIZEBOX = 65536
GLOBAL CONST $WS_MINIMIZEBOX = 131072
GLOBAL CONST $WS_TABSTOP = 65536
GLOBAL CONST $WS_GROUP = 131072
GLOBAL CONST $WS_SIZEBOX = 262144
GLOBAL CONST $WS_THICKFRAME = $WS_SIZEBOX
GLOBAL CONST $WS_SYSMENU = 524288
GLOBAL CONST $WS_HSCROLL = 1048576
GLOBAL CONST $WS_VSCROLL = 2097152
GLOBAL CONST $WS_DLGFRAME = 4194304
GLOBAL CONST $WS_BORDER = 8388608
GLOBAL CONST $WS_CAPTION = 12582912
GLOBAL CONST $WS_OVERLAPPEDWINDOW = BITOR($WS_CAPTION, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_OVERLAPPED, $WS_SYSMENU, $WS_THICKFRAME)
GLOBAL CONST $WS_TILEDWINDOW = $WS_OVERLAPPEDWINDOW
GLOBAL CONST $WS_MAXIMIZE = 16777216
GLOBAL CONST $WS_CLIPCHILDREN = 33554432
GLOBAL CONST $WS_CLIPSIBLINGS = 67108864
GLOBAL CONST $WS_DISABLED = 134217728
GLOBAL CONST $WS_VISIBLE = 268435456
GLOBAL CONST $WS_MINIMIZE = 536870912
GLOBAL CONST $WS_ICONIC = $WS_MINIMIZE
GLOBAL CONST $WS_CHILD = 1073741824
GLOBAL CONST $WS_CHILDWINDOW = $WS_CHILD
GLOBAL CONST $WS_POPUP = -2147483648
GLOBAL CONST $WS_POPUPWINDOW = -2138570752
GLOBAL CONST $DS_3DLOOK = 4
GLOBAL CONST $DS_ABSALIGN = 1
GLOBAL CONST $DS_CENTER = 2048
GLOBAL CONST $DS_CENTERMOUSE = 4096
GLOBAL CONST $DS_CONTEXTHELP = 8192
GLOBAL CONST $DS_CONTROL = 1024
GLOBAL CONST $DS_FIXEDSYS = 8
GLOBAL CONST $DS_LOCALEDIT = 32
GLOBAL CONST $DS_MODALFRAME = 128
GLOBAL CONST $DS_NOFAILCREATE = 16
GLOBAL CONST $DS_NOIDLEMSG = 256
GLOBAL CONST $DS_SETFONT = 64
GLOBAL CONST $DS_SETFOREGROUND = 512
GLOBAL CONST $DS_SHELLFONT = BITOR($DS_FIXEDSYS, $DS_SETFONT)
GLOBAL CONST $DS_SYSMODAL = 2
GLOBAL CONST $WS_EX_ACCEPTFILES = 16
GLOBAL CONST $WS_EX_APPWINDOW = 262144
GLOBAL CONST $WS_EX_COMPOSITED = 33554432
GLOBAL CONST $WS_EX_CONTROLPARENT = 65536
GLOBAL CONST $WS_EX_CLIENTEDGE = 512
GLOBAL CONST $WS_EX_CONTEXTHELP = 1024
GLOBAL CONST $WS_EX_DLGMODALFRAME = 1
GLOBAL CONST $WS_EX_LAYERED = 524288
GLOBAL CONST $WS_EX_LAYOUTRTL = 4194304
GLOBAL CONST $WS_EX_LEFT = 0
GLOBAL CONST $WS_EX_LEFTSCROLLBAR = 16384
GLOBAL CONST $WS_EX_LTRREADING = 0
GLOBAL CONST $WS_EX_MDICHILD = 64
GLOBAL CONST $WS_EX_NOACTIVATE = 134217728
GLOBAL CONST $WS_EX_NOINHERITLAYOUT = 1048576
GLOBAL CONST $WS_EX_NOPARENTNOTIFY = 4
GLOBAL CONST $WS_EX_NOREDIRECTIONBITMAP = 2097152
GLOBAL CONST $WS_EX_RIGHT = 4096
GLOBAL CONST $WS_EX_RIGHTSCROLLBAR = 0
GLOBAL CONST $WS_EX_RTLREADING = 8192
GLOBAL CONST $WS_EX_STATICEDGE = 131072
GLOBAL CONST $WS_EX_TOOLWINDOW = 128
GLOBAL CONST $WS_EX_TOPMOST = 8
GLOBAL CONST $WS_EX_TRANSPARENT = 32
GLOBAL CONST $WS_EX_WINDOWEDGE = 256
GLOBAL CONST $WS_EX_OVERLAPPEDWINDOW = BITOR($WS_EX_CLIENTEDGE, $WS_EX_WINDOWEDGE)
GLOBAL CONST $WS_EX_PALETTEWINDOW = BITOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE)
GLOBAL CONST $WM_NULL = 0
GLOBAL CONST $WM_CREATE = 1
GLOBAL CONST $WM_DESTROY = 2
GLOBAL CONST $WM_MOVE = 3
GLOBAL CONST $WM_SIZEWAIT = 4
GLOBAL CONST $WM_SIZE = 5
GLOBAL CONST $WM_ACTIVATE = 6
GLOBAL CONST $WM_SETFOCUS = 7
GLOBAL CONST $WM_KILLFOCUS = 8
GLOBAL CONST $WM_SETVISIBLE = 9
GLOBAL CONST $WM_ENABLE = 10
GLOBAL CONST $WM_SETREDRAW = 11
GLOBAL CONST $WM_SETTEXT = 12
GLOBAL CONST $WM_GETTEXT = 13
GLOBAL CONST $WM_GETTEXTLENGTH = 14
GLOBAL CONST $WM_PAINT = 15
GLOBAL CONST $WM_CLOSE = 16
GLOBAL CONST $WM_QUERYENDSESSION = 17
GLOBAL CONST $WM_QUIT = 18
GLOBAL CONST $WM_ERASEBKGND = 20
GLOBAL CONST $WM_QUERYOPEN = 19
GLOBAL CONST $WM_SYSCOLORCHANGE = 21
GLOBAL CONST $WM_ENDSESSION = 22
GLOBAL CONST $WM_SYSTEMERROR = 23
GLOBAL CONST $WM_SHOWWINDOW = 24
GLOBAL CONST $WM_CTLCOLOR = 25
GLOBAL CONST $WM_SETTINGCHANGE = 26
GLOBAL CONST $WM_WININICHANGE = 26
GLOBAL CONST $WM_DEVMODECHANGE = 27
GLOBAL CONST $WM_ACTIVATEAPP = 28
GLOBAL CONST $WM_FONTCHANGE = 29
GLOBAL CONST $WM_TIMECHANGE = 30
GLOBAL CONST $WM_CANCELMODE = 31
GLOBAL CONST $WM_SETCURSOR = 32
GLOBAL CONST $WM_MOUSEACTIVATE = 33
GLOBAL CONST $WM_CHILDACTIVATE = 34
GLOBAL CONST $WM_QUEUESYNC = 35
GLOBAL CONST $WM_GETMINMAXINFO = 36
GLOBAL CONST $WM_LOGOFF = 37
GLOBAL CONST $WM_PAINTICON = 38
GLOBAL CONST $WM_ICONERASEBKGND = 39
GLOBAL CONST $WM_NEXTDLGCTL = 40
GLOBAL CONST $WM_ALTTABACTIVE = 41
GLOBAL CONST $WM_SPOOLERSTATUS = 42
GLOBAL CONST $WM_DRAWITEM = 43
GLOBAL CONST $WM_MEASUREITEM = 44
GLOBAL CONST $WM_DELETEITEM = 45
GLOBAL CONST $WM_VKEYTOITEM = 46
GLOBAL CONST $WM_CHARTOITEM = 47
GLOBAL CONST $WM_SETFONT = 48
GLOBAL CONST $WM_GETFONT = 49
GLOBAL CONST $WM_SETHOTKEY = 50
GLOBAL CONST $WM_GETHOTKEY = 51
GLOBAL CONST $WM_FILESYSCHANGE = 52
GLOBAL CONST $WM_ISACTIVEICON = 53
GLOBAL CONST $WM_QUERYPARKICON = 54
GLOBAL CONST $WM_QUERYDRAGICON = 55
GLOBAL CONST $WM_WINHELP = 56
GLOBAL CONST $WM_COMPAREITEM = 57
GLOBAL CONST $WM_FULLSCREEN = 58
GLOBAL CONST $WM_CLIENTSHUTDOWN = 59
GLOBAL CONST $WM_DDEMLEVENT = 60
GLOBAL CONST $WM_GETOBJECT = 61
GLOBAL CONST $WM_CALCSCROLL = 63
GLOBAL CONST $WM_TESTING = 64
GLOBAL CONST $WM_COMPACTING = 65
GLOBAL CONST $WM_OTHERWINDOWCREATED = 66
GLOBAL CONST $WM_OTHERWINDOWDESTROYED = 67
GLOBAL CONST $WM_COMMNOTIFY = 68
GLOBAL CONST $WM_MEDIASTATUSCHANGE = 69
GLOBAL CONST $WM_WINDOWPOSCHANGING = 70
GLOBAL CONST $WM_WINDOWPOSCHANGED = 71
GLOBAL CONST $WM_POWER = 72
GLOBAL CONST $WM_COPYGLOBALDATA = 73
GLOBAL CONST $WM_COPYDATA = 74
GLOBAL CONST $WM_CANCELJOURNAL = 75
GLOBAL CONST $WM_LOGONNOTIFY = 76
GLOBAL CONST $WM_KEYF1 = 77
GLOBAL CONST $WM_NOTIFY = 78
GLOBAL CONST $WM_ACCESS_WINDOW = 79
GLOBAL CONST $WM_INPUTLANGCHANGEREQUEST = 80
GLOBAL CONST $WM_INPUTLANGCHANGE = 81
GLOBAL CONST $WM_TCARD = 82
GLOBAL CONST $WM_HELP = 83
GLOBAL CONST $WM_USERCHANGED = 84
GLOBAL CONST $WM_NOTIFYFORMAT = 85
GLOBAL CONST $WM_QM_ACTIVATE = 96
GLOBAL CONST $WM_HOOK_DO_CALLBACK = 97
GLOBAL CONST $WM_SYSCOPYDATA = 98
GLOBAL CONST $WM_FINALDESTROY = 112
GLOBAL CONST $WM_MEASUREITEM_CLIENTDATA = 113
GLOBAL CONST $WM_CONTEXTMENU = 123
GLOBAL CONST $WM_STYLECHANGING = 124
GLOBAL CONST $WM_STYLECHANGED = 125
GLOBAL CONST $WM_DISPLAYCHANGE = 126
GLOBAL CONST $WM_GETICON = 127
GLOBAL CONST $WM_SETICON = 128
GLOBAL CONST $WM_NCCREATE = 129
GLOBAL CONST $WM_NCDESTROY = 130
GLOBAL CONST $WM_NCCALCSIZE = 131
GLOBAL CONST $WM_NCHITTEST = 132
GLOBAL CONST $WM_NCPAINT = 133
GLOBAL CONST $WM_NCACTIVATE = 134
GLOBAL CONST $WM_GETDLGCODE = 135
GLOBAL CONST $WM_SYNCPAINT = 136
GLOBAL CONST $WM_SYNCTASK = 137
GLOBAL CONST $WM_KLUDGEMINRECT = 139
GLOBAL CONST $WM_LPKDRAWSWITCHWND = 140
GLOBAL CONST $WM_UAHDESTROYWINDOW = 144
GLOBAL CONST $WM_UAHDRAWMENU = 145
GLOBAL CONST $WM_UAHDRAWMENUITEM = 146
GLOBAL CONST $WM_UAHINITMENU = 147
GLOBAL CONST $WM_UAHMEASUREMENUITEM = 148
GLOBAL CONST $WM_UAHNCPAINTMENUPOPUP = 149
GLOBAL CONST $WM_NCMOUSEMOVE = 160
GLOBAL CONST $WM_NCLBUTTONDOWN = 161
GLOBAL CONST $WM_NCLBUTTONUP = 162
GLOBAL CONST $WM_NCLBUTTONDBLCLK = 163
GLOBAL CONST $WM_NCRBUTTONDOWN = 164
GLOBAL CONST $WM_NCRBUTTONUP = 165
GLOBAL CONST $WM_NCRBUTTONDBLCLK = 166
GLOBAL CONST $WM_NCMBUTTONDOWN = 167
GLOBAL CONST $WM_NCMBUTTONUP = 168
GLOBAL CONST $WM_NCMBUTTONDBLCLK = 169
GLOBAL CONST $WM_NCXBUTTONDOWN = 171
GLOBAL CONST $WM_NCXBUTTONUP = 172
GLOBAL CONST $WM_NCXBUTTONDBLCLK = 173
GLOBAL CONST $WM_NCUAHDRAWCAPTION = 174
GLOBAL CONST $WM_NCUAHDRAWFRAME = 175
GLOBAL CONST $WM_INPUT_DEVICE_CHANGE = 254
GLOBAL CONST $WM_INPUT = 255
GLOBAL CONST $WM_KEYDOWN = 256
GLOBAL CONST $WM_KEYFIRST = 256
GLOBAL CONST $WM_KEYUP = 257
GLOBAL CONST $WM_CHAR = 258
GLOBAL CONST $WM_DEADCHAR = 259
GLOBAL CONST $WM_SYSKEYDOWN = 260
GLOBAL CONST $WM_SYSKEYUP = 261
GLOBAL CONST $WM_SYSCHAR = 262
GLOBAL CONST $WM_SYSDEADCHAR = 263
GLOBAL CONST $WM_YOMICHAR = 264
GLOBAL CONST $WM_KEYLAST = 265
GLOBAL CONST $WM_UNICHAR = 265
GLOBAL CONST $WM_CONVERTREQUEST = 266
GLOBAL CONST $WM_CONVERTRESULT = 267
GLOBAL CONST $WM_IM_INFO = 268
GLOBAL CONST $WM_IME_STARTCOMPOSITION = 269
GLOBAL CONST $WM_IME_ENDCOMPOSITION = 270
GLOBAL CONST $WM_IME_COMPOSITION = 271
GLOBAL CONST $WM_IME_KEYLAST = 271
GLOBAL CONST $WM_INITDIALOG = 272
GLOBAL CONST $WM_COMMAND = 273
GLOBAL CONST $WM_SYSCOMMAND = 274
GLOBAL CONST $WM_TIMER = 275
GLOBAL CONST $WM_HSCROLL = 276
GLOBAL CONST $WM_VSCROLL = 277
GLOBAL CONST $WM_INITMENU = 278
GLOBAL CONST $WM_INITMENUPOPUP = 279
GLOBAL CONST $WM_SYSTIMER = 280
GLOBAL CONST $WM_GESTURE = 281
GLOBAL CONST $WM_GESTURENOTIFY = 282
GLOBAL CONST $WM_GESTUREINPUT = 283
GLOBAL CONST $WM_GESTURENOTIFIED = 284
GLOBAL CONST $WM_MENUSELECT = 287
GLOBAL CONST $WM_MENUCHAR = 288
GLOBAL CONST $WM_ENTERIDLE = 289
GLOBAL CONST $WM_MENURBUTTONUP = 290
GLOBAL CONST $WM_MENUDRAG = 291
GLOBAL CONST $WM_MENUGETOBJECT = 292
GLOBAL CONST $WM_UNINITMENUPOPUP = 293
GLOBAL CONST $WM_MENUCOMMAND = 294
GLOBAL CONST $WM_CHANGEUISTATE = 295
GLOBAL CONST $WM_UPDATEUISTATE = 296
GLOBAL CONST $WM_QUERYUISTATE = 297
GLOBAL CONST $WM_LBTRACKPOINT = 305
GLOBAL CONST $WM_CTLCOLORMSGBOX = 306
GLOBAL CONST $WM_CTLCOLOREDIT = 307
GLOBAL CONST $WM_CTLCOLORLISTBOX = 308
GLOBAL CONST $WM_CTLCOLORBTN = 309
GLOBAL CONST $WM_CTLCOLORDLG = 310
GLOBAL CONST $WM_CTLCOLORSCROLLBAR = 311
GLOBAL CONST $WM_CTLCOLORSTATIC = 312
GLOBAL CONST $MN_GETHMENU = 481
GLOBAL CONST $WM_PARENTNOTIFY = 528
GLOBAL CONST $WM_ENTERMENULOOP = 529
GLOBAL CONST $WM_EXITMENULOOP = 530
GLOBAL CONST $WM_NEXTMENU = 531
GLOBAL CONST $WM_SIZING = 532
GLOBAL CONST $WM_CAPTURECHANGED = 533
GLOBAL CONST $WM_MOVING = 534
GLOBAL CONST $WM_POWERBROADCAST = 536
GLOBAL CONST $WM_DEVICECHANGE = 537
GLOBAL CONST $WM_MDICREATE = 544
GLOBAL CONST $WM_MDIDESTROY = 545
GLOBAL CONST $WM_MDIACTIVATE = 546
GLOBAL CONST $WM_MDIRESTORE = 547
GLOBAL CONST $WM_MDINEXT = 548
GLOBAL CONST $WM_MDIMAXIMIZE = 549
GLOBAL CONST $WM_MDITILE = 550
GLOBAL CONST $WM_MDICASCADE = 551
GLOBAL CONST $WM_MDIICONARRANGE = 552
GLOBAL CONST $WM_MDIGETACTIVE = 553
GLOBAL CONST $WM_DROPOBJECT = 554
GLOBAL CONST $WM_QUERYDROPOBJECT = 555
GLOBAL CONST $WM_BEGINDRAG = 556
GLOBAL CONST $WM_DRAGLOOP = 557
GLOBAL CONST $WM_DRAGSELECT = 558
GLOBAL CONST $WM_DRAGMOVE = 559
GLOBAL CONST $WM_MDISETMENU = 560
GLOBAL CONST $WM_ENTERSIZEMOVE = 561
GLOBAL CONST $WM_EXITSIZEMOVE = 562
GLOBAL CONST $WM_DROPFILES = 563
GLOBAL CONST $WM_MDIREFRESHMENU = 564
GLOBAL CONST $WM_TOUCH = 576
GLOBAL CONST $WM_IME_SETCONTEXT = 641
GLOBAL CONST $WM_IME_NOTIFY = 642
GLOBAL CONST $WM_IME_CONTROL = 643
GLOBAL CONST $WM_IME_COMPOSITIONFULL = 644
GLOBAL CONST $WM_IME_SELECT = 645
GLOBAL CONST $WM_IME_CHAR = 646
GLOBAL CONST $WM_IME_SYSTEM = 647
GLOBAL CONST $WM_IME_REQUEST = 648
GLOBAL CONST $WM_IME_KEYDOWN = 656
GLOBAL CONST $WM_IME_KEYUP = 657
GLOBAL CONST $WM_NCMOUSEHOVER = 672
GLOBAL CONST $WM_MOUSEHOVER = 673
GLOBAL CONST $WM_NCMOUSELEAVE = 674
GLOBAL CONST $WM_MOUSELEAVE = 675
GLOBAL CONST $WM_WTSSESSION_CHANGE = 689
GLOBAL CONST $WM_TABLET_FIRST = 704
GLOBAL CONST $WM_TABLET_LAST = 735
GLOBAL CONST $WM_CUT = 768
GLOBAL CONST $WM_COPY = 769
GLOBAL CONST $WM_PASTE = 770
GLOBAL CONST $WM_CLEAR = 771
GLOBAL CONST $WM_UNDO = 772
GLOBAL CONST $WM_PALETTEISCHANGING = 784
GLOBAL CONST $WM_HOTKEY = 786
GLOBAL CONST $WM_PALETTECHANGED = 785
GLOBAL CONST $WM_SYSMENU = 787
GLOBAL CONST $WM_HOOKMSG = 788
GLOBAL CONST $WM_EXITPROCESS = 789
GLOBAL CONST $WM_WAKETHREAD = 790
GLOBAL CONST $WM_PRINT = 791
GLOBAL CONST $WM_PRINTCLIENT = 792
GLOBAL CONST $WM_APPCOMMAND = 793
GLOBAL CONST $WM_QUERYNEWPALETTE = 783
GLOBAL CONST $WM_THEMECHANGED = 794
GLOBAL CONST $WM_UAHINIT = 795
GLOBAL CONST $WM_DESKTOPNOTIFY = 796
GLOBAL CONST $WM_CLIPBOARDUPDATE = 797
GLOBAL CONST $WM_DWMCOMPOSITIONCHANGED = 798
GLOBAL CONST $WM_DWMNCRENDERINGCHANGED = 799
GLOBAL CONST $WM_DWMCOLORIZATIONCOLORCHANGED = 800
GLOBAL CONST $WM_DWMWINDOWMAXIMIZEDCHANGE = 801
GLOBAL CONST $WM_DWMEXILEFRAME = 802
GLOBAL CONST $WM_DWMSENDICONICTHUMBNAIL = 803
GLOBAL CONST $WM_MAGNIFICATION_STARTED = 804
GLOBAL CONST $WM_MAGNIFICATION_ENDED = 805
GLOBAL CONST $WM_DWMSENDICONICLIVEPREVIEWBITMAP = 806
GLOBAL CONST $WM_DWMTHUMBNAILSIZECHANGED = 807
GLOBAL CONST $WM_MAGNIFICATION_OUTPUT = 808
GLOBAL CONST $WM_MEASURECONTROL = 816
GLOBAL CONST $WM_GETACTIONTEXT = 817
GLOBAL CONST $WM_FORWARDKEYDOWN = 819
GLOBAL CONST $WM_FORWARDKEYUP = 820
GLOBAL CONST $WM_GETTITLEBARINFOEX = 831
GLOBAL CONST $WM_NOTIFYWOW = 832
GLOBAL CONST $WM_HANDHELDFIRST = 856
GLOBAL CONST $WM_HANDHELDLAST = 863
GLOBAL CONST $WM_AFXFIRST = 864
GLOBAL CONST $WM_AFXLAST = 895
GLOBAL CONST $WM_PENWINFIRST = 896
GLOBAL CONST $WM_PENWINLAST = 911
GLOBAL CONST $WM_DDE_INITIATE = 992
GLOBAL CONST $WM_DDE_TERMINATE = 993
GLOBAL CONST $WM_DDE_ADVISE = 994
GLOBAL CONST $WM_DDE_UNADVISE = 995
GLOBAL CONST $WM_DDE_ACK = 996
GLOBAL CONST $WM_DDE_DATA = 997
GLOBAL CONST $WM_DDE_REQUEST = 998
GLOBAL CONST $WM_DDE_POKE = 999
GLOBAL CONST $WM_DDE_EXECUTE = 1000
GLOBAL CONST $WM_DBNOTIFICATION = 1021
GLOBAL CONST $WM_NETCONNECT = 1022
GLOBAL CONST $WM_HIBERNATE = 1023
GLOBAL CONST $WM_USER = 1024
GLOBAL CONST $WM_APP = 32768
GLOBAL CONST $NM_FIRST = 0
GLOBAL CONST $NM_OUTOFMEMORY = $NM_FIRST - 1
GLOBAL CONST $NM_CLICK = $NM_FIRST - 2
GLOBAL CONST $NM_DBLCLK = $NM_FIRST - 3
GLOBAL CONST $NM_RETURN = $NM_FIRST - 4
GLOBAL CONST $NM_RCLICK = $NM_FIRST - 5
GLOBAL CONST $NM_RDBLCLK = $NM_FIRST - 6
GLOBAL CONST $NM_SETFOCUS = $NM_FIRST - 7
GLOBAL CONST $NM_KILLFOCUS = $NM_FIRST - 8
GLOBAL CONST $NM_CUSTOMDRAW = $NM_FIRST - 12
GLOBAL CONST $NM_HOVER = $NM_FIRST - 13
GLOBAL CONST $NM_NCHITTEST = $NM_FIRST - 14
GLOBAL CONST $NM_KEYDOWN = $NM_FIRST - 15
GLOBAL CONST $NM_RELEASEDCAPTURE = $NM_FIRST - 16
GLOBAL CONST $NM_SETCURSOR = $NM_FIRST - 17
GLOBAL CONST $NM_CHAR = $NM_FIRST - 18
GLOBAL CONST $NM_TOOLTIPSCREATED = $NM_FIRST - 19
GLOBAL CONST $NM_LDOWN = $NM_FIRST - 20
GLOBAL CONST $NM_RDOWN = $NM_FIRST - 21
GLOBAL CONST $NM_THEMECHANGED = $NM_FIRST - 22
GLOBAL CONST $WM_MOUSEFIRST = 512
GLOBAL CONST $WM_MOUSEMOVE = 512
GLOBAL CONST $WM_LBUTTONDOWN = 513
GLOBAL CONST $WM_LBUTTONUP = 514
GLOBAL CONST $WM_LBUTTONDBLCLK = 515
GLOBAL CONST $WM_RBUTTONDOWN = 516
GLOBAL CONST $WM_RBUTTONUP = 517
GLOBAL CONST $WM_RBUTTONDBLCLK = 518
GLOBAL CONST $WM_MBUTTONDOWN = 519
GLOBAL CONST $WM_MBUTTONUP = 520
GLOBAL CONST $WM_MBUTTONDBLCLK = 521
GLOBAL CONST $WM_MOUSEWHEEL = 522
GLOBAL CONST $WM_XBUTTONDOWN = 523
GLOBAL CONST $WM_XBUTTONUP = 524
GLOBAL CONST $WM_XBUTTONDBLCLK = 525
GLOBAL CONST $WM_MOUSEHWHEEL = 526
GLOBAL CONST $PS_SOLID = 0
GLOBAL CONST $PS_DASH = 1
GLOBAL CONST $PS_DOT = 2
GLOBAL CONST $PS_DASHDOT = 3
GLOBAL CONST $PS_DASHDOTDOT = 4
GLOBAL CONST $PS_NULL = 5
GLOBAL CONST $PS_INSIDEFRAME = 6
GLOBAL CONST $PS_USERSTYLE = 7
GLOBAL CONST $PS_ALTERNATE = 8
GLOBAL CONST $PS_ENDCAP_ROUND = 0
GLOBAL CONST $PS_ENDCAP_SQUARE = 256
GLOBAL CONST $PS_ENDCAP_FLAT = 512
GLOBAL CONST $PS_JOIN_BEVEL = 4096
GLOBAL CONST $PS_JOIN_MITER = 8192
GLOBAL CONST $PS_JOIN_ROUND = 0
GLOBAL CONST $PS_GEOMETRIC = 65536
GLOBAL CONST $PS_COSMETIC = 0
GLOBAL CONST $LWA_ALPHA = 2
GLOBAL CONST $LWA_COLORKEY = 1
GLOBAL CONST $RGN_AND = 1
GLOBAL CONST $RGN_OR = 2
GLOBAL CONST $RGN_XOR = 3
GLOBAL CONST $RGN_DIFF = 4
GLOBAL CONST $RGN_COPY = 5
GLOBAL CONST $ERRORREGION = 0
GLOBAL CONST $NULLREGION = 1
GLOBAL CONST $SIMPLEREGION = 2
GLOBAL CONST $COMPLEXREGION = 3
GLOBAL CONST $TRANSPARENT = 1
GLOBAL CONST $OPAQUE = 2
GLOBAL CONST $CCM_FIRST = 8192
GLOBAL CONST $CCM_GETUNICODEFORMAT = ($CCM_FIRST + 6)
GLOBAL CONST $CCM_SETUNICODEFORMAT = ($CCM_FIRST + 5)
GLOBAL CONST $CCM_SETBKCOLOR = $CCM_FIRST + 1
GLOBAL CONST $CCM_SETCOLORSCHEME = $CCM_FIRST + 2
GLOBAL CONST $CCM_GETCOLORSCHEME = $CCM_FIRST + 3
GLOBAL CONST $CCM_GETDROPTARGET = $CCM_FIRST + 4
GLOBAL CONST $CCM_SETWINDOWTHEME = $CCM_FIRST + 11
GLOBAL CONST $GA_PARENT = 1
GLOBAL CONST $GA_ROOT = 2
GLOBAL CONST $GA_ROOTOWNER = 3
GLOBAL CONST $SM_CXSCREEN = 0
GLOBAL CONST $SM_CYSCREEN = 1
GLOBAL CONST $SM_CXVSCROLL = 2
GLOBAL CONST $SM_CYHSCROLL = 3
GLOBAL CONST $SM_CYCAPTION = 4
GLOBAL CONST $SM_CXBORDER = 5
GLOBAL CONST $SM_CYBORDER = 6
GLOBAL CONST $SM_CXFIXEDFRAME = 7
GLOBAL CONST $SM_CXDLGFRAME = $SM_CXFIXEDFRAME
GLOBAL CONST $SM_CYFIXEDFRAME = 8
GLOBAL CONST $SM_CYDLGFRAME = $SM_CYFIXEDFRAME
GLOBAL CONST $SM_CYVTHUMB = 9
GLOBAL CONST $SM_CXHTHUMB = 10
GLOBAL CONST $SM_CXICON = 11
GLOBAL CONST $SM_CYICON = 12
GLOBAL CONST $SM_CXCURSOR = 13
GLOBAL CONST $SM_CYCURSOR = 14
GLOBAL CONST $SM_CYMENU = 15
GLOBAL CONST $SM_CXFULLSCREEN = 16
GLOBAL CONST $SM_CYFULLSCREEN = 17
GLOBAL CONST $SM_CYKANJIWINDOW = 18
GLOBAL CONST $SM_MOUSEPRESENT = 19
GLOBAL CONST $SM_CYVSCROLL = 20
GLOBAL CONST $SM_CXHSCROLL = 21
GLOBAL CONST $SM_DEBUG = 22
GLOBAL CONST $SM_SWAPBUTTON = 23
GLOBAL CONST $SM_RESERVED1 = 24
GLOBAL CONST $SM_RESERVED2 = 25
GLOBAL CONST $SM_RESERVED3 = 26
GLOBAL CONST $SM_RESERVED4 = 27
GLOBAL CONST $SM_CXMIN = 28
GLOBAL CONST $SM_CYMIN = 29
GLOBAL CONST $SM_CXSIZE = 30
GLOBAL CONST $SM_CYSIZE = 31
GLOBAL CONST $SM_CXSIZEFRAME = 32
GLOBAL CONST $SM_CXFRAME = $SM_CXSIZEFRAME
GLOBAL CONST $SM_CYSIZEFRAME = 33
GLOBAL CONST $SM_CYFRAME = $SM_CYSIZEFRAME
GLOBAL CONST $SM_CXMINTRACK = 34
GLOBAL CONST $SM_CYMINTRACK = 35
GLOBAL CONST $SM_CXDOUBLECLK = 36
GLOBAL CONST $SM_CYDOUBLECLK = 37
GLOBAL CONST $SM_CXICONSPACING = 38
GLOBAL CONST $SM_CYICONSPACING = 39
GLOBAL CONST $SM_MENUDROPALIGNMENT = 40
GLOBAL CONST $SM_PENWINDOWS = 41
GLOBAL CONST $SM_DBCSENABLED = 42
GLOBAL CONST $SM_CMOUSEBUTTONS = 43
GLOBAL CONST $SM_SECURE = 44
GLOBAL CONST $SM_CXEDGE = 45
GLOBAL CONST $SM_CYEDGE = 46
GLOBAL CONST $SM_CXMINSPACING = 47
GLOBAL CONST $SM_CYMINSPACING = 48
GLOBAL CONST $SM_CXSMICON = 49
GLOBAL CONST $SM_CYSMICON = 50
GLOBAL CONST $SM_CYSMCAPTION = 51
GLOBAL CONST $SM_CXSMSIZE = 52
GLOBAL CONST $SM_CYSMSIZE = 53
GLOBAL CONST $SM_CXMENUSIZE = 54
GLOBAL CONST $SM_CYMENUSIZE = 55
GLOBAL CONST $SM_ARRANGE = 56
GLOBAL CONST $SM_CXMINIMIZED = 57
GLOBAL CONST $SM_CYMINIMIZED = 58
GLOBAL CONST $SM_CXMAXTRACK = 59
GLOBAL CONST $SM_CYMAXTRACK = 60
GLOBAL CONST $SM_CXMAXIMIZED = 61
GLOBAL CONST $SM_CYMAXIMIZED = 62
GLOBAL CONST $SM_NETWORK = 63
GLOBAL CONST $SM_CLEANBOOT = 67
GLOBAL CONST $SM_CXDRAG = 68
GLOBAL CONST $SM_CYDRAG = 69
GLOBAL CONST $SM_SHOWSOUNDS = 70
GLOBAL CONST $SM_CXMENUCHECK = 71
GLOBAL CONST $SM_CYMENUCHECK = 72
GLOBAL CONST $SM_SLOWMACHINE = 73
GLOBAL CONST $SM_MIDEASTENABLED = 74
GLOBAL CONST $SM_MOUSEWHEELPRESENT = 75
GLOBAL CONST $SM_XVIRTUALSCREEN = 76
GLOBAL CONST $SM_YVIRTUALSCREEN = 77
GLOBAL CONST $SM_CXVIRTUALSCREEN = 78
GLOBAL CONST $SM_CYVIRTUALSCREEN = 79
GLOBAL CONST $SM_CMONITORS = 80
GLOBAL CONST $SM_SAMEDISPLAYFORMAT = 81
GLOBAL CONST $SM_IMMENABLED = 82
GLOBAL CONST $SM_CXFOCUSBORDER = 83
GLOBAL CONST $SM_CYFOCUSBORDER = 84
GLOBAL CONST $SM_TABLETPC = 86
GLOBAL CONST $SM_MEDIACENTER = 87
GLOBAL CONST $SM_STARTER = 88
GLOBAL CONST $SM_SERVERR2 = 89
GLOBAL CONST $SM_CMETRICS = 90
GLOBAL CONST $SM_REMOTESESSION = 4096
GLOBAL CONST $SM_SHUTTINGDOWN = 8192
GLOBAL CONST $SM_REMOTECONTROL = 8193
GLOBAL CONST $SM_CARETBLINKINGENABLED = 8194
GLOBAL CONST $BLACKNESS = 66
GLOBAL CONST $CAPTUREBLT = 1073741824
GLOBAL CONST $DSTINVERT = 5570569
GLOBAL CONST $MERGECOPY = 12583114
GLOBAL CONST $MERGEPAINT = 12255782
GLOBAL CONST $NOMIRRORBITMAP = -2147483648
GLOBAL CONST $NOTSRCCOPY = 3342344
GLOBAL CONST $NOTSRCERASE = 1114278
GLOBAL CONST $PATCOPY = 15728673
GLOBAL CONST $PATINVERT = 5898313
GLOBAL CONST $PATPAINT = 16452105
GLOBAL CONST $SRCAND = 8913094
GLOBAL CONST $SRCCOPY = 13369376
GLOBAL CONST $SRCERASE = 4457256
GLOBAL CONST $SRCINVERT = 6684742
GLOBAL CONST $SRCPAINT = 15597702
GLOBAL CONST $WHITENESS = 16711778
GLOBAL CONST $DT_BOTTOM = 8
GLOBAL CONST $DT_CALCRECT = 1024
GLOBAL CONST $DT_CENTER = 1
GLOBAL CONST $DT_EDITCONTROL = 8192
GLOBAL CONST $DT_END_ELLIPSIS = 32768
GLOBAL CONST $DT_EXPANDTABS = 64
GLOBAL CONST $DT_EXTERNALLEADING = 512
GLOBAL CONST $DT_HIDEPREFIX = 1048576
GLOBAL CONST $DT_INTERNAL = 4096
GLOBAL CONST $DT_LEFT = 0
GLOBAL CONST $DT_MODIFYSTRING = 65536
GLOBAL CONST $DT_NOCLIP = 256
GLOBAL CONST $DT_NOFULLWIDTHCHARBREAK = 524288
GLOBAL CONST $DT_NOPREFIX = 2048
GLOBAL CONST $DT_PATH_ELLIPSIS = 16384
GLOBAL CONST $DT_PREFIXONLY = 2097152
GLOBAL CONST $DT_RIGHT = 2
GLOBAL CONST $DT_RTLREADING = 131072
GLOBAL CONST $DT_SINGLELINE = 32
GLOBAL CONST $DT_TABSTOP = 128
GLOBAL CONST $DT_TOP = 0
GLOBAL CONST $DT_VCENTER = 4
GLOBAL CONST $DT_WORDBREAK = 16
GLOBAL CONST $DT_WORD_ELLIPSIS = 262144
GLOBAL CONST $RDW_ERASE = 4
GLOBAL CONST $RDW_FRAME = 1024
GLOBAL CONST $RDW_INTERNALPAINT = 2
GLOBAL CONST $RDW_INVALIDATE = 1
GLOBAL CONST $RDW_NOERASE = 32
GLOBAL CONST $RDW_NOFRAME = 2048
GLOBAL CONST $RDW_NOINTERNALPAINT = 16
GLOBAL CONST $RDW_VALIDATE = 8
GLOBAL CONST $RDW_ERASENOW = 512
GLOBAL CONST $RDW_UPDATENOW = 256
GLOBAL CONST $RDW_ALLCHILDREN = 128
GLOBAL CONST $RDW_NOCHILDREN = 64
GLOBAL CONST $WM_RENDERFORMAT = 773
GLOBAL CONST $WM_RENDERALLFORMATS = 774
GLOBAL CONST $WM_DESTROYCLIPBOARD = 775
GLOBAL CONST $WM_DRAWCLIPBOARD = 776
GLOBAL CONST $WM_PAINTCLIPBOARD = 777
GLOBAL CONST $WM_VSCROLLCLIPBOARD = 778
GLOBAL CONST $WM_SIZECLIPBOARD = 779
GLOBAL CONST $WM_ASKCBFORMATNAME = 780
GLOBAL CONST $WM_CHANGECBCHAIN = 781
GLOBAL CONST $WM_HSCROLLCLIPBOARD = 782
GLOBAL CONST $HTERROR = -2
GLOBAL CONST $HTTRANSPARENT = -1
GLOBAL CONST $HTNOWHERE = 0
GLOBAL CONST $HTCLIENT = 1
GLOBAL CONST $HTCAPTION = 2
GLOBAL CONST $HTSYSMENU = 3
GLOBAL CONST $HTGROWBOX = 4
GLOBAL CONST $HTSIZE = $HTGROWBOX
GLOBAL CONST $HTMENU = 5
GLOBAL CONST $HTHSCROLL = 6
GLOBAL CONST $HTVSCROLL = 7
GLOBAL CONST $HTMINBUTTON = 8
GLOBAL CONST $HTMAXBUTTON = 9
GLOBAL CONST $HTLEFT = 10
GLOBAL CONST $HTRIGHT = 11
GLOBAL CONST $HTTOP = 12
GLOBAL CONST $HTTOPLEFT = 13
GLOBAL CONST $HTTOPRIGHT = 14
GLOBAL CONST $HTBOTTOM = 15
GLOBAL CONST $HTBOTTOMLEFT = 16
GLOBAL CONST $HTBOTTOMRIGHT = 17
GLOBAL CONST $HTBORDER = 18
GLOBAL CONST $HTREDUCE = $HTMINBUTTON
GLOBAL CONST $HTZOOM = $HTMAXBUTTON
GLOBAL CONST $HTSIZEFIRST = $HTLEFT
GLOBAL CONST $HTSIZELAST = $HTBOTTOMRIGHT
GLOBAL CONST $HTOBJECT = 19
GLOBAL CONST $HTCLOSE = 20
GLOBAL CONST $HTHELP = 21
GLOBAL CONST $COLOR_SCROLLBAR = 0
GLOBAL CONST $COLOR_BACKGROUND = 1
GLOBAL CONST $COLOR_ACTIVECAPTION = 2
GLOBAL CONST $COLOR_INACTIVECAPTION = 3
GLOBAL CONST $COLOR_MENU = 4
GLOBAL CONST $COLOR_WINDOW = 5
GLOBAL CONST $COLOR_WINDOWFRAME = 6
GLOBAL CONST $COLOR_MENUTEXT = 7
GLOBAL CONST $COLOR_WINDOWTEXT = 8
GLOBAL CONST $COLOR_CAPTIONTEXT = 9
GLOBAL CONST $COLOR_ACTIVEBORDER = 10
GLOBAL CONST $COLOR_INACTIVEBORDER = 11
GLOBAL CONST $COLOR_APPWORKSPACE = 12
GLOBAL CONST $COLOR_HIGHLIGHT = 13
GLOBAL CONST $COLOR_HIGHLIGHTTEXT = 14
GLOBAL CONST $COLOR_BTNFACE = 15
GLOBAL CONST $COLOR_BTNSHADOW = 16
GLOBAL CONST $COLOR_GRAYTEXT = 17
GLOBAL CONST $COLOR_BTNTEXT = 18
GLOBAL CONST $COLOR_INACTIVECAPTIONTEXT = 19
GLOBAL CONST $COLOR_BTNHIGHLIGHT = 20
GLOBAL CONST $COLOR_3DDKSHADOW = 21
GLOBAL CONST $COLOR_3DLIGHT = 22
GLOBAL CONST $COLOR_INFOTEXT = 23
GLOBAL CONST $COLOR_INFOBK = 24
GLOBAL CONST $COLOR_HOTLIGHT = 26
GLOBAL CONST $COLOR_GRADIENTACTIVECAPTION = 27
GLOBAL CONST $COLOR_GRADIENTINACTIVECAPTION = 28
GLOBAL CONST $COLOR_MENUHILIGHT = 29
GLOBAL CONST $COLOR_MENUBAR = 30
GLOBAL CONST $COLOR_DESKTOP = 1
GLOBAL CONST $COLOR_3DFACE = 15
GLOBAL CONST $COLOR_3DSHADOW = 16
GLOBAL CONST $COLOR_3DHIGHLIGHT = 20
GLOBAL CONST $COLOR_3DHILIGHT = 20
GLOBAL CONST $COLOR_BTNHILIGHT = 20
GLOBAL CONST $HINST_COMMCTRL = -1
GLOBAL CONST $IDB_STD_SMALL_COLOR = 0
GLOBAL CONST $IDB_STD_LARGE_COLOR = 1
GLOBAL CONST $IDB_VIEW_SMALL_COLOR = 4
GLOBAL CONST $IDB_VIEW_LARGE_COLOR = 5
GLOBAL CONST $IDB_HIST_SMALL_COLOR = 8
GLOBAL CONST $IDB_HIST_LARGE_COLOR = 9
GLOBAL CONST $STARTF_FORCEOFFFEEDBACK = 128
GLOBAL CONST $STARTF_FORCEONFEEDBACK = 64
GLOBAL CONST $STARTF_PREVENTPINNING = 8192
GLOBAL CONST $STARTF_RUNFULLSCREEN = 32
GLOBAL CONST $STARTF_TITLEISAPPID = 4096
GLOBAL CONST $STARTF_TITLEISLINKNAME = 2048
GLOBAL CONST $STARTF_USECOUNTCHARS = 8
GLOBAL CONST $STARTF_USEFILLATTRIBUTE = 16
GLOBAL CONST $STARTF_USEHOTKEY = 512
GLOBAL CONST $STARTF_USEPOSITION = 4
GLOBAL CONST $STARTF_USESHOWWINDOW = 1
GLOBAL CONST $STARTF_USESIZE = 2
GLOBAL CONST $STARTF_USESTDHANDLES = 256
GLOBAL CONST $CDDS_PREPAINT = 1
GLOBAL CONST $CDDS_POSTPAINT = 2
GLOBAL CONST $CDDS_PREERASE = 3
GLOBAL CONST $CDDS_POSTERASE = 4
GLOBAL CONST $CDDS_ITEM = 65536
GLOBAL CONST $CDDS_ITEMPREPAINT = 65537
GLOBAL CONST $CDDS_ITEMPOSTPAINT = 65538
GLOBAL CONST $CDDS_ITEMPREERASE = 65539
GLOBAL CONST $CDDS_ITEMPOSTERASE = 65540
GLOBAL CONST $CDDS_SUBITEM = 131072
GLOBAL CONST $CDIS_SELECTED = 1
GLOBAL CONST $CDIS_GRAYED = 2
GLOBAL CONST $CDIS_DISABLED = 4
GLOBAL CONST $CDIS_CHECKED = 8
GLOBAL CONST $CDIS_FOCUS = 16
GLOBAL CONST $CDIS_DEFAULT = 32
GLOBAL CONST $CDIS_HOT = 64
GLOBAL CONST $CDIS_MARKED = 128
GLOBAL CONST $CDIS_INDETERMINATE = 256
GLOBAL CONST $CDIS_SHOWKEYBOARDCUES = 512
GLOBAL CONST $CDIS_NEARHOT = 1024
GLOBAL CONST $CDIS_OTHERSIDEHOT = 2048
GLOBAL CONST $CDIS_DROPHILITED = 4096
GLOBAL CONST $CDRF_DODEFAULT = 0
GLOBAL CONST $CDRF_NEWFONT = 2
GLOBAL CONST $CDRF_SKIPDEFAULT = 4
GLOBAL CONST $CDRF_NOTIFYPOSTPAINT = 16
GLOBAL CONST $CDRF_NOTIFYITEMDRAW = 32
GLOBAL CONST $CDRF_NOTIFYSUBITEMDRAW = 32
GLOBAL CONST $CDRF_NOTIFYPOSTERASE = 64
GLOBAL CONST $CDRF_DOERASE = 8
GLOBAL CONST $CDRF_SKIPPOSTPAINT = 256
GLOBAL CONST $GUI_SS_DEFAULT_GUI = BITOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)
#Region Global Variables and Constants
GLOBAL $_G_ARRAYDISPLAY_BUSERFUNC = FALSE
GLOBAL $_G_ARRAYDISPLAY_HLISTVIEW
GLOBAL $_G_ARRAYDISPLAY_ITRANSPOSE
GLOBAL $_G_ARRAYDISPLAY_IDISPLAYROW
GLOBAL $_G_ARRAYDISPLAY_AARRAY
GLOBAL $_G_ARRAYDISPLAY_IDIMS
GLOBAL $_G_ARRAYDISPLAY_NROWS
GLOBAL $_G_ARRAYDISPLAY_NCOLS
GLOBAL $_G_ARRAYDISPLAY_IITEM_START
GLOBAL $_G_ARRAYDISPLAY_IITEM_END
GLOBAL $_G_ARRAYDISPLAY_ISUBITEM_START
GLOBAL $_G_ARRAYDISPLAY_ISUBITEM_END
GLOBAL $_G_ARRAYDISPLAY_AINDEX
GLOBAL $_G_ARRAYDISPLAY_AINDEXES[1]
GLOBAL $_G_ARRAYDISPLAY_ISORTDIR
GLOBAL $_G_ARRAYDISPLAY_ASHEADER
GLOBAL $_G_ARRAYDISPLAY_ANUMERICSORT
GLOBAL $ARRAYDISPLAY_ROWPREFIX = "#"
GLOBAL $ARRAYDISPLAY_NUMERICSORT = "*"
GLOBAL CONST $ARRAYDISPLAY_COLALIGNLEFT = 0
GLOBAL CONST $ARRAYDISPLAY_TRANSPOSE = 1
GLOBAL CONST $ARRAYDISPLAY_COLALIGNRIGHT = 2
GLOBAL CONST $ARRAYDISPLAY_COLALIGNCENTER = 4
GLOBAL CONST $ARRAYDISPLAY_VERBOSE = 8
GLOBAL CONST $ARRAYDISPLAY_NOROW = 64
GLOBAL CONST $ARRAYDISPLAY_CHECKERROR = 128
GLOBAL CONST $_ARRAYCONSTANT_TAGLVITEM = "struct;uint Mask;int Item;int SubItem;uint State;uint StateMask;ptr Text;int TextMax;int Image;lparam Param;" & "int Indent;int GroupID;uint Columns;ptr pColumns;ptr piColFmt;int iGroup;endstruct"
#EndRegion Global Variables and Constants
#Region Functions list
#EndRegion Functions list
FUNC __ARRAYDISPLAY_SHARE(CONST BYREF $AARRAY, $STITLE = DEFAULT, $SARRAYRANGE = DEFAULT, $IFLAGS = DEFAULT, $VUSER_SEPARATOR = DEFAULT, $SHEADER = DEFAULT, $IDESIRED_COLWIDTH = DEFAULT, $HUSER_FUNCTION = DEFAULT, $BDEBUG = TRUE, CONST $_ISCRIPTLINENUMBER = @SCRIPTLINENUMBER, CONST $_ICALLERERROR = @ERROR, CONST $_ICALLEREXTENDED = @EXTENDED)
LOCAL $SMSGBOXTITLE = (($BDEBUG) ? ("_DebugArrayDisplay") : ("_ArrayDisplay"))
IF $_G_ARRAYDISPLAY_BUSERFUNC THEN
$HUSER_FUNCTION = DEFAULT
$BDEBUG = FALSE
ENDIF
IF NOT ISKEYWORD($HUSER_FUNCTION) = $KEYWORD_DEFAULT THEN
$_G_ARRAYDISPLAY_BUSERFUNC = TRUE
ENDIF
IF $STITLE = DEFAULT THEN $STITLE = $SMSGBOXTITLE
IF $SARRAYRANGE = DEFAULT THEN $SARRAYRANGE = ""
IF $IFLAGS = DEFAULT THEN $IFLAGS = 0
IF $VUSER_SEPARATOR = DEFAULT THEN $VUSER_SEPARATOR = ""
IF $SHEADER = DEFAULT THEN $SHEADER = ""
LOCAL $IMIN_COLWIDTH = 55
LOCAL $IMAX_COLWIDTH = 350
IF $IDESIRED_COLWIDTH > 0 THEN $IMAX_COLWIDTH = $IDESIRED_COLWIDTH
IF $IDESIRED_COLWIDTH < 0 THEN $IMIN_COLWIDTH = -$IDESIRED_COLWIDTH
IF $IMAX_COLWIDTH = DEFAULT THEN $IMAX_COLWIDTH = 350
IF $IMAX_COLWIDTH > 4095 THEN $IMAX_COLWIDTH = 4095
IF $HUSER_FUNCTION = DEFAULT THEN $HUSER_FUNCTION = 0
$_G_ARRAYDISPLAY_ITRANSPOSE = BITAND($IFLAGS, $ARRAYDISPLAY_TRANSPOSE)
LOCAL $ICOLALIGN = BITAND($IFLAGS, 6)
LOCAL $IVERBOSE = INT(BITAND($IFLAGS, $ARRAYDISPLAY_VERBOSE))
$_G_ARRAYDISPLAY_IDISPLAYROW = INT(BITAND($IFLAGS, $ARRAYDISPLAY_NOROW) = 0)
LOCAL $IBUTTONBORDER = (($BDEBUG) ? (40) : (20))
#Region Check valid array
LOCAL $SMSG = "", $IRET = 1
LOCAL $FTIMER = 0
IF ISARRAY($AARRAY) THEN
$_G_ARRAYDISPLAY_AARRAY = $AARRAY
$_G_ARRAYDISPLAY_IDIMS = UBOUND($_G_ARRAYDISPLAY_AARRAY, $UBOUND_DIMENSIONS)
IF $_G_ARRAYDISPLAY_IDIMS = 1 THEN $_G_ARRAYDISPLAY_ITRANSPOSE = 0
$_G_ARRAYDISPLAY_NROWS = UBOUND($_G_ARRAYDISPLAY_AARRAY, $UBOUND_ROWS)
$_G_ARRAYDISPLAY_NCOLS = ($_G_ARRAYDISPLAY_IDIMS = 2) ? UBOUND($_G_ARRAYDISPLAY_AARRAY, $UBOUND_COLUMNS) : 1
DIM $_G_ARRAYDISPLAY_ANUMERICSORT[$_G_ARRAYDISPLAY_NCOLS]
IF $_G_ARRAYDISPLAY_IDIMS > 2 THEN
$SMSG = "Larger than 2D array passed to function"
$IRET = 2
ENDIF
IF $_ICALLERERROR THEN
IF $BDEBUG THEN
IF ISDECLARED("__g_sReportCallBack_DebugReport_Debug") THEN
$SMSG = "@@ Debug( " & $_ISCRIPTLINENUMBER & ") : @error = " & $_ICALLERERROR & " in " & $SMSGBOXTITLE & "( '" & $STITLE & "' )"
EXECUTE('$__g_sReportCallBack_DebugReport_Debug("' & $SMSG & '")')
ENDIF
$IRET = 3
ELSEIF BITAND($IFLAGS, $ARRAYDISPLAY_CHECKERROR) THEN
$SMSG = "@error = " & $_ICALLERERROR & " when calling the function"
IF $_ISCRIPTLINENUMBER > 0 THEN $SMSG &= " at line " & $_ISCRIPTLINENUMBER
$IRET = 3
ENDIF
ENDIF
ELSE
$SMSG = "No array variable passed to function"
ENDIF
IF $SMSG THEN
IF $IVERBOSE AND MSGBOX($MB_SYSTEMMODAL + $MB_ICONERROR + $MB_YESNO, $SMSGBOXTITLE & "() Error: " & $STITLE, $SMSG & @CRLF & @CRLF & "Exit the script?") = $IDYES THEN
EXIT
ELSE
RETURN SETERROR($IRET, 0, 0)
ENDIF
ENDIF
#EndRegion Check valid array
#Region Check array range
LOCAL $ICW_COLWIDTH = NUMBER($VUSER_SEPARATOR)
LOCAL $SCURR_SEPARATOR = OPT("GUIDataSeparatorChar")
IF $VUSER_SEPARATOR = "" THEN $VUSER_SEPARATOR = $SCURR_SEPARATOR
$_G_ARRAYDISPLAY_IITEM_START = 0
$_G_ARRAYDISPLAY_IITEM_END = $_G_ARRAYDISPLAY_NROWS - 1
$_G_ARRAYDISPLAY_ISUBITEM_START = 0
$_G_ARRAYDISPLAY_ISUBITEM_END = (($_G_ARRAYDISPLAY_IDIMS = 2) ? ($_G_ARRAYDISPLAY_NCOLS - 1) : (0))
LOCAL $AVRANGESPLIT
IF $SARRAYRANGE THEN
LOCAL $VTMP, $AARRAY_RANGE = STRINGREGEXP($SARRAYRANGE & "||", "(?U)(.*)\|", $STR_REGEXPARRAYGLOBALMATCH)
IF $AARRAY_RANGE[0] THEN
$AVRANGESPLIT = STRINGSPLIT($AARRAY_RANGE[0], ":")
IF @ERROR THEN
$_G_ARRAYDISPLAY_IITEM_END = NUMBER($AARRAY_RANGE[0])
ELSE
$_G_ARRAYDISPLAY_IITEM_START = NUMBER($AVRANGESPLIT[1])
IF $AVRANGESPLIT[2] <> "" THEN
$_G_ARRAYDISPLAY_IITEM_END = NUMBER($AVRANGESPLIT[2])
ENDIF
ENDIF
ENDIF
IF $_G_ARRAYDISPLAY_IITEM_START < 0 THEN $_G_ARRAYDISPLAY_IITEM_START = 0
IF $_G_ARRAYDISPLAY_IITEM_END >= $_G_ARRAYDISPLAY_NROWS THEN $_G_ARRAYDISPLAY_IITEM_END = $_G_ARRAYDISPLAY_NROWS - 1
IF($_G_ARRAYDISPLAY_IITEM_START > $_G_ARRAYDISPLAY_IITEM_END) AND($_G_ARRAYDISPLAY_IITEM_END > 0) THEN
$VTMP = $_G_ARRAYDISPLAY_IITEM_START
$_G_ARRAYDISPLAY_IITEM_START = $_G_ARRAYDISPLAY_IITEM_END
$_G_ARRAYDISPLAY_IITEM_END = $VTMP
ENDIF
IF $_G_ARRAYDISPLAY_IDIMS = 2 AND $AARRAY_RANGE[1] THEN
$AVRANGESPLIT = STRINGSPLIT($AARRAY_RANGE[1], ":")
IF @ERROR THEN
$_G_ARRAYDISPLAY_ISUBITEM_END = NUMBER($AARRAY_RANGE[1])
ELSE
$_G_ARRAYDISPLAY_ISUBITEM_START = NUMBER($AVRANGESPLIT[1])
IF $AVRANGESPLIT[2] <> "" THEN
$_G_ARRAYDISPLAY_ISUBITEM_END = NUMBER($AVRANGESPLIT[2])
ENDIF
ENDIF
IF $_G_ARRAYDISPLAY_ISUBITEM_START > $_G_ARRAYDISPLAY_ISUBITEM_END THEN
$VTMP = $_G_ARRAYDISPLAY_ISUBITEM_START
$_G_ARRAYDISPLAY_ISUBITEM_START = $_G_ARRAYDISPLAY_ISUBITEM_END
$_G_ARRAYDISPLAY_ISUBITEM_END = $VTMP
ENDIF
IF $_G_ARRAYDISPLAY_ISUBITEM_START < 0 THEN $_G_ARRAYDISPLAY_ISUBITEM_START = 0
IF $_G_ARRAYDISPLAY_ISUBITEM_END >= $_G_ARRAYDISPLAY_NCOLS THEN $_G_ARRAYDISPLAY_ISUBITEM_END = $_G_ARRAYDISPLAY_NCOLS - 1
ENDIF
ENDIF
LOCAL $SDISPLAYDATA = "[" & $_G_ARRAYDISPLAY_NROWS & "]"
IF $_G_ARRAYDISPLAY_IDIMS = 2 THEN
$SDISPLAYDATA &= " [" & $_G_ARRAYDISPLAY_NCOLS & "]"
ENDIF
LOCAL $STIPDATA = ""
IF $SARRAYRANGE THEN
IF $STIPDATA THEN $STIPDATA &= " - "
$STIPDATA &= "Range set " & $SARRAYRANGE
ENDIF
IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
IF $STIPDATA THEN $STIPDATA &= " - "
$STIPDATA &= "Transposed"
ENDIF
IF $SARRAYRANGE OR $_G_ARRAYDISPLAY_ITRANSPOSE THEN $_G_ARRAYDISPLAY_AARRAY = __ARRAYDISPLAY_CREATESUBARRAY()
#EndRegion Check array range
#Region Check custom header
$_G_ARRAYDISPLAY_ASHEADER = STRINGSPLIT($SHEADER, $SCURR_SEPARATOR, $STR_NOCOUNT)
IF UBOUND($_G_ARRAYDISPLAY_ASHEADER) = 0 THEN DIM $_G_ARRAYDISPLAY_ASHEADER[1] = [""]
$SHEADER = "Row"
LOCAL $IINDEX = $_G_ARRAYDISPLAY_ISUBITEM_START
IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
$SHEADER = "Row"
FOR $J = 0 TO $_G_ARRAYDISPLAY_NCOLS - 1
$SHEADER &= $SCURR_SEPARATOR & $ARRAYDISPLAY_ROWPREFIX & " " & $J + $_G_ARRAYDISPLAY_ISUBITEM_START
NEXT
ELSE
IF $_G_ARRAYDISPLAY_ASHEADER[0] THEN
FOR $IINDEX = $_G_ARRAYDISPLAY_ISUBITEM_START TO $_G_ARRAYDISPLAY_ISUBITEM_END
IF $IINDEX >= UBOUND($_G_ARRAYDISPLAY_ASHEADER) THEN EXITLOOP
IF STRINGRIGHT($_G_ARRAYDISPLAY_ASHEADER[$IINDEX], 1) = $ARRAYDISPLAY_NUMERICSORT THEN
$_G_ARRAYDISPLAY_ASHEADER[$IINDEX] = STRINGTRIMRIGHT($_G_ARRAYDISPLAY_ASHEADER[$IINDEX], 1)
$_G_ARRAYDISPLAY_ANUMERICSORT[$IINDEX - $_G_ARRAYDISPLAY_ISUBITEM_START] = 1
ENDIF
$SHEADER &= $SCURR_SEPARATOR & $_G_ARRAYDISPLAY_ASHEADER[$IINDEX]
NEXT
ENDIF
FOR $J = $IINDEX TO $_G_ARRAYDISPLAY_ISUBITEM_END
$SHEADER &= $SCURR_SEPARATOR & "Col " & $J
NEXT
ENDIF
IF NOT $_G_ARRAYDISPLAY_IDISPLAYROW THEN $SHEADER = STRINGTRIMLEFT($SHEADER, 4)
#EndRegion Check custom header
#Region Generate Sort index for columns
__ARRAYDISPLAY_SORTINDEXES(0, -1)
LOCAL $HTIMER = TIMERINIT()
__ARRAYDISPLAY_SORTINDEXES(1, 1)
$FTIMER = TIMERDIFF($HTIMER)
IF $FTIMER * $_G_ARRAYDISPLAY_NCOLS < 1000 THEN
__ARRAYDISPLAY_SORTINDEXES(2, $_G_ARRAYDISPLAY_NCOLS)
ELSE
ENDIF
#EndRegion Generate Sort index for columns
#Region GUI and Listview generation
IF $IVERBOSE AND($_G_ARRAYDISPLAY_NROWS * $_G_ARRAYDISPLAY_NCOLS) > 1000 THEN
SPLASHTEXTON($SMSGBOXTITLE, "Preparing display" & @CRLF & @CRLF & "Please be patient", 300, 100)
ENDIF
LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 64
LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKBORDERS = 102
LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 512
LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKLEFT = 2
LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKRIGHT = 4
LOCAL CONST $_ARRAYCONSTANT_GUI_DOCKHCENTER = 8
LOCAL CONST $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
LOCAL CONST $_ARRAYCONSTANT_GUI_EVENT_ARRAY = 1
LOCAL CONST $_ARRAYCONSTANT_GUI_FOCUS = 256
LOCAL CONST $_ARRAYCONSTANT_SS_CENTER = 1
LOCAL CONST $_ARRAYCONSTANT_SS_CENTERIMAGE = 512
LOCAL CONST $_ARRAYCONSTANT_LVM_GETITEMRECT = (4096 + 14)
LOCAL CONST $_ARRAYCONSTANT_LVM_GETITEMSTATE = (4096 + 44)
LOCAL CONST $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT = (4096 + 50)
LOCAL CONST $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (4096 + 54)
LOCAL CONST $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 1
LOCAL CONST $_ARRAYCONSTANT_LVIS_SELECTED = 2
LOCAL CONST $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 8
LOCAL CONST $_ARRAYCONSTANT_LVS_OWNERDATA = 4096
LOCAL CONST $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 32
LOCAL CONST $_ARRAYCONSTANT_LVS_EX_DOUBLEBUFFER = 65536
LOCAL CONST $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 512
LOCAL CONST $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 65536
LOCAL CONST $_ARRAYCONSTANT_WS_MINIMIZEBOX = 131072
LOCAL CONST $_ARRAYCONSTANT_WS_SIZEBOX = 262144
LOCAL $ICOORDMODE = OPT("GUICoordMode", 1)
LOCAL $IORGWIDTH = 210, $IHEIGHT = 200, $IMINSIZE = 250
LOCAL $HGUI = GUICREATE($STITLE, $IORGWIDTH, $IHEIGHT, DEFAULT, DEFAULT, BITOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
LOCAL $AIGUISIZE = WINGETCLIENTSIZE($HGUI)
LOCAL $IDLISTVIEW = GUICTRLCREATELISTVIEW($SHEADER, 0, 0, $AIGUISIZE[0], $AIGUISIZE[1] - $IBUTTONBORDER, BITOR($_ARRAYCONSTANT_LVS_SHOWSELALWAYS, $_ARRAYCONSTANT_LVS_OWNERDATA))
$_G_ARRAYDISPLAY_HLISTVIEW = GUICTRLGETHANDLE($IDLISTVIEW)
GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_DOUBLEBUFFER, $_ARRAYCONSTANT_LVS_EX_DOUBLEBUFFER)
GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE)
LOCAL $HHEADER = HWND(GUICTRLSENDMSG($IDLISTVIEW, (4096 + 31), 0, 0))
GUICTRLSETRESIZING($IDLISTVIEW, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
LOCAL $ICOLFILL = $_G_ARRAYDISPLAY_NCOLS + $_G_ARRAYDISPLAY_IDISPLAYROW
IF $ICOLALIGN THEN
FOR $I = 0 TO $ICOLFILL - 1
__ARRAYDISPLAY_JUSTIFYCOLUMN($IDLISTVIEW, $I, $ICOLALIGN / 2)
NEXT
ENDIF
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 47), $_G_ARRAYDISPLAY_NROWS, 0)
LOCAL $TRECT = DLLSTRUCTCREATE("struct; long Left;long Top;long Right;long Bottom; endstruct")
DLLCALL("user32.dll", "struct*", "SendMessageW", "hwnd", $_G_ARRAYDISPLAY_HLISTVIEW, "uint", $_ARRAYCONSTANT_LVM_GETITEMRECT, "wparam", 0, "struct*", $TRECT)
LOCAL $AIWIN_POS = WINGETPOS($HGUI)
LOCAL $AILV_POS = CONTROLGETPOS($HGUI, "", $IDLISTVIEW)
$IHEIGHT = (($_G_ARRAYDISPLAY_NROWS + 3) * (DLLSTRUCTGETDATA($TRECT, "Bottom") - DLLSTRUCTGETDATA($TRECT, "Top"))) + $AIWIN_POS[3] - $AILV_POS[3]
IF $IHEIGHT > @DESKTOPHEIGHT - 100 THEN
$IHEIGHT = @DESKTOPHEIGHT - 100
ELSEIF $IHEIGHT < $IMINSIZE THEN
$IHEIGHT = $IMINSIZE
ENDIF
IF $IVERBOSE THEN SPLASHOFF()
$_G_ARRAYDISPLAY_ISORTDIR = 1024
LOCAL $ICOLUMN = 0, $ICOLUMNPREV = -1
IF $_G_ARRAYDISPLAY_IDISPLAYROW THEN
$ICOLUMNPREV = $ICOLUMN
__ARRAYDISPLAY_HEADERSETITEMFORMAT($HHEADER, $ICOLUMN, 16384 + $_G_ARRAYDISPLAY_ISORTDIR + $ICOLALIGN / 2)
ENDIF
$_G_ARRAYDISPLAY_AINDEX = $_G_ARRAYDISPLAY_AINDEXES[0]
#EndRegion GUI and Listview generation
LOCAL $P__ARRAYDISPLAY_NOTIFYHANDLER = DLLCALLBACKGETPTR(DLLCALLBACKREGISTER("__ArrayDisplay_NotifyHandler", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
DLLCALL("comctl32.dll", "bool", "SetWindowSubclass", "hwnd", $HGUI, "ptr", $P__ARRAYDISPLAY_NOTIFYHANDLER, "uint_ptr", 0, "dword_ptr", 0)
#Region Adjust dialog width
LOCAL $IWIDTH = 40, $ICOLWIDTH = 0, $AICOLWIDTH[$ICOLFILL]
LOCAL $ICOLWIDTHHEADER, $IMIN_COLW = 55
FOR $I = 0 TO $ICOLFILL - 1
IF $I > 0 THEN $IMIN_COLW = $IMIN_COLWIDTH
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, -1)
$ICOLWIDTH = GUICTRLSENDMSG($IDLISTVIEW, (4096 + 29), $I, 0)
IF $SHEADER <> "" THEN
IF $ICOLWIDTH = 0 THEN EXITLOOP
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, -2)
$ICOLWIDTHHEADER = GUICTRLSENDMSG($IDLISTVIEW, (4096 + 29), $I, 0)
IF $ICOLWIDTH < $IMIN_COLW AND $ICOLWIDTHHEADER < $IMIN_COLW THEN
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $IMIN_COLW)
$ICOLWIDTH = $IMIN_COLW
ELSEIF $ICOLWIDTHHEADER < $ICOLWIDTH THEN
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $ICOLWIDTH)
ELSE
$ICOLWIDTH = $ICOLWIDTHHEADER
ENDIF
ELSE
IF $ICOLWIDTH < $IMIN_COLW THEN
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $IMIN_COLW)
$ICOLWIDTH = $IMIN_COLW
ENDIF
ENDIF
$IWIDTH += $ICOLWIDTH
$AICOLWIDTH[$I] = $ICOLWIDTH
NEXT
IF $IWIDTH > @DESKTOPWIDTH - 100 THEN
$IWIDTH = 40
FOR $I = 0 TO $ICOLFILL - 1
IF $AICOLWIDTH[$I] > $IMAX_COLWIDTH THEN
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 30), $I, $IMAX_COLWIDTH)
$IWIDTH += $IMAX_COLWIDTH
ELSE
$IWIDTH += $AICOLWIDTH[$I]
ENDIF
IF $I < 20 AND $BDEBUG THEN CONSOLEWRITE("@@ Debug(" & @SCRIPTLINENUMBER & ") : $iWidth = " & $IWIDTH & " $i = " & $I & @CRLF)
NEXT
ENDIF
IF $IWIDTH > @DESKTOPWIDTH - 100 THEN
$IWIDTH = @DESKTOPWIDTH - 100
ELSEIF $IWIDTH < $IMINSIZE THEN
$IWIDTH = $IMINSIZE
ENDIF
#EndRegion Adjust dialog width
LOCAL $ISCROLLBARSIZE = 0
IF $IHEIGHT = (@DESKTOPHEIGHT - 100) THEN $ISCROLLBARSIZE = 15
WINMOVE($HGUI, "", (@DESKTOPWIDTH - $IWIDTH + $ISCROLLBARSIZE) / 2, (@DESKTOPHEIGHT - $IHEIGHT) / 2, $IWIDTH + $ISCROLLBARSIZE, $IHEIGHT)
$AIGUISIZE = WINGETCLIENTSIZE($HGUI)
GUICTRLSETPOS($IDLISTVIEW, 0, 0, $IWIDTH, $AIGUISIZE[1] - $IBUTTONBORDER)
#Region Create bottom infos
LOCAL $IBUTTONWIDTH_1 = $AIGUISIZE[0] / 2
LOCAL $IBUTTONWIDTH_2 = $AIGUISIZE[0] / 3
LOCAL $IDCOPY_ID = 9999, $IDCOPY_DATA = 99999, $IDDATA_LABEL = 99999, $IDUSER_FUNC = 99999, $IDEXIT_SCRIPT = 99999
IF $BDEBUG THEN
$IDCOPY_ID = GUICTRLCREATEBUTTON("Copy Data && Hdr/Row", 0, $AIGUISIZE[1] - $IBUTTONBORDER, $IBUTTONWIDTH_1, 20)
$IDCOPY_DATA = GUICTRLCREATEBUTTON("Copy Data Only", $IBUTTONWIDTH_1, $AIGUISIZE[1] - $IBUTTONBORDER, $IBUTTONWIDTH_1, 20)
LOCAL $IBUTTONWIDTH_VAR = $IBUTTONWIDTH_1
LOCAL $IOFFSET = $IBUTTONWIDTH_1
IF ISFUNC($HUSER_FUNCTION) THEN
$IDUSER_FUNC = GUICTRLCREATEBUTTON("Run User Func", $IBUTTONWIDTH_2, $AIGUISIZE[1] - 20, $IBUTTONWIDTH_2, 20)
$IBUTTONWIDTH_VAR = $IBUTTONWIDTH_2
$IOFFSET = $IBUTTONWIDTH_2 * 2
ENDIF
$IDEXIT_SCRIPT = GUICTRLCREATEBUTTON("Exit Script", $IOFFSET, $AIGUISIZE[1] - 20, $IBUTTONWIDTH_VAR, 20)
$IDDATA_LABEL = GUICTRLCREATELABEL($SDISPLAYDATA, 0, $AIGUISIZE[1] - 20, $IBUTTONWIDTH_VAR, 18, BITOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE))
ELSE
$IDDATA_LABEL = GUICTRLCREATELABEL($SDISPLAYDATA, 0, $AIGUISIZE[1] - 20, $AIGUISIZE[0], 18, BITOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE))
ENDIF
IF $_G_ARRAYDISPLAY_ITRANSPOSE OR $SARRAYRANGE THEN
GUICTRLSETCOLOR($IDDATA_LABEL, 16711680)
GUICTRLSETTIP($IDDATA_LABEL, $STIPDATA)
ENDIF
GUICTRLSETRESIZING($IDCOPY_ID, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
GUICTRLSETRESIZING($IDCOPY_DATA, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
GUICTRLSETRESIZING($IDDATA_LABEL, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
GUICTRLSETRESIZING($IDUSER_FUNC, $_ARRAYCONSTANT_GUI_DOCKHCENTER + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
GUICTRLSETRESIZING($IDEXIT_SCRIPT, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
#EndRegion Create bottom infos
GUISETSTATE(@SW_SHOW, $HGUI)
IF $FTIMER > 1000 AND NOT $SARRAYRANGE THEN
BEEP(750, 250)
TOOLTIP("Sorting Action can take as long as " & CEILING($FTIMER / 1000) & " sec" & @CRLF & @CRLF & "Please be patient when you click to sort a column", 50, 50, $SMSGBOXTITLE, $TIP_WARNINGICON, $TIP_BALLOON)
SLEEP(3000)
TOOLTIP("")
ENDIF
#Region GUI Handling events
LOCAL $IONEVENTMODE = OPT("GUIOnEventMode", 0), $AMSG
WHILE 1
$AMSG = GUIGETMSG($_ARRAYCONSTANT_GUI_EVENT_ARRAY)
IF $AMSG[1] = $HGUI THEN
SWITCH $AMSG[0]
CASE $_ARRAYCONSTANT_GUI_EVENT_CLOSE
EXITLOOP
CASE $IDCOPY_ID, $IDCOPY_DATA
LOCAL $ISEL_COUNT = GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT, 0, 0)
IF $IVERBOSE AND(NOT $ISEL_COUNT) AND($_G_ARRAYDISPLAY_IITEM_END - $_G_ARRAYDISPLAY_IITEM_START) * ($_G_ARRAYDISPLAY_ISUBITEM_END - $_G_ARRAYDISPLAY_ISUBITEM_START) > 10000 THEN
SPLASHTEXTON($SMSGBOXTITLE, "Copying data" & @CRLF & @CRLF & "Please be patient", 300, 100)
ENDIF
LOCAL $SCLIP = "", $SITEM, $ASPLIT, $IFIRSTCOL = 0
IF $AMSG[0] = $IDCOPY_DATA AND $_G_ARRAYDISPLAY_IDISPLAYROW THEN $IFIRSTCOL = 1
FOR $I = 0 TO GUICTRLSENDMSG($IDLISTVIEW, 4100, 0, 0) - 1
IF $ISEL_COUNT AND NOT(GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $I, $_ARRAYCONSTANT_LVIS_SELECTED) <> 0) THEN
CONTINUELOOP
ENDIF
$SITEM = __ARRAYDISPLAY_GETITEMTEXTSTRINGSELECTED($IDLISTVIEW, $I, $IFIRSTCOL)
IF $AMSG[0] = $IDCOPY_ID AND NOT $_G_ARRAYDISPLAY_IDISPLAYROW THEN
$SITEM = $ARRAYDISPLAY_ROWPREFIX & " " & ($I + $_G_ARRAYDISPLAY_IITEM_START) & $SCURR_SEPARATOR & $SITEM
ENDIF
IF $ICW_COLWIDTH THEN
$ASPLIT = STRINGSPLIT($SITEM, $SCURR_SEPARATOR)
$SITEM = ""
FOR $J = 1 TO $ASPLIT[0]
$SITEM &= STRINGFORMAT("%-" & $ICW_COLWIDTH + 1 & "s", STRINGLEFT($ASPLIT[$J], $ICW_COLWIDTH))
NEXT
ELSE
$SITEM = STRINGREPLACE($SITEM, $SCURR_SEPARATOR, $VUSER_SEPARATOR)
ENDIF
$SCLIP &= $SITEM & @CRLF
NEXT
$SITEM = $SHEADER
IF $AMSG[0] = $IDCOPY_ID THEN
$SITEM = $SHEADER
IF NOT $_G_ARRAYDISPLAY_IDISPLAYROW THEN
$SITEM = "Row" & $SCURR_SEPARATOR & $SITEM
ENDIF
IF $ICW_COLWIDTH THEN
$ASPLIT = STRINGSPLIT($SITEM, $SCURR_SEPARATOR)
$SITEM = ""
FOR $J = 1 TO $ASPLIT[0]
$SITEM &= STRINGFORMAT("%-" & $ICW_COLWIDTH + 1 & "s", STRINGLEFT($ASPLIT[$J], $ICW_COLWIDTH))
NEXT
ELSE
$SITEM = STRINGREPLACE($SITEM, $SCURR_SEPARATOR, $VUSER_SEPARATOR)
ENDIF
$SCLIP = $SITEM & @CRLF & $SCLIP
ENDIF
CLIPPUT($SCLIP)
SPLASHOFF()
GUICTRLSETSTATE($IDLISTVIEW, $_ARRAYCONSTANT_GUI_FOCUS)
CASE $IDLISTVIEW
$ICOLUMN = GUICTRLGETSTATE($IDLISTVIEW)
IF NOT ISARRAY($_G_ARRAYDISPLAY_AINDEXES[$ICOLUMN + NOT $_G_ARRAYDISPLAY_IDISPLAYROW]) THEN
__ARRAYDISPLAY_SORTINDEXES($ICOLUMN + NOT $_G_ARRAYDISPLAY_IDISPLAYROW)
ENDIF
IF $ICOLUMN <> $ICOLUMNPREV THEN
__ARRAYDISPLAY_HEADERSETITEMFORMAT($HHEADER, $ICOLUMNPREV, 16384 + $ICOLALIGN / 2)
IF $_G_ARRAYDISPLAY_IDISPLAYROW AND $ICOLUMN = 0 THEN
$_G_ARRAYDISPLAY_AINDEX = $_G_ARRAYDISPLAY_AINDEXES[0]
ELSE
$_G_ARRAYDISPLAY_AINDEX = $_G_ARRAYDISPLAY_AINDEXES[$ICOLUMN + NOT $_G_ARRAYDISPLAY_IDISPLAYROW]
ENDIF
ENDIF
$_G_ARRAYDISPLAY_ISORTDIR = ($ICOLUMN = $ICOLUMNPREV) ? $_G_ARRAYDISPLAY_ISORTDIR = 1024 ? 512 : 1024 : 1024
__ARRAYDISPLAY_HEADERSETITEMFORMAT($HHEADER, $ICOLUMN, 16384 + $_G_ARRAYDISPLAY_ISORTDIR + $ICOLALIGN / 2)
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 140), $ICOLUMN, 0)
GUICTRLSENDMSG($IDLISTVIEW, (4096 + 47), $_G_ARRAYDISPLAY_NROWS, 0)
$ICOLUMNPREV = $ICOLUMN
CASE $IDUSER_FUNC
LOCAL $AISELITEMS[1] = [0]
FOR $I = 0 TO GUICTRLSENDMSG($IDLISTVIEW, 4100, 0, 0) - 1
IF(GUICTRLSENDMSG($IDLISTVIEW, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $I, $_ARRAYCONSTANT_LVIS_SELECTED) <> 0) THEN
$AISELITEMS[0] += 1
REDIM $AISELITEMS[$AISELITEMS[0] + 1]
$AISELITEMS[$AISELITEMS[0]] = $I + $_G_ARRAYDISPLAY_IITEM_START
ENDIF
NEXT
$HUSER_FUNCTION($_G_ARRAYDISPLAY_AARRAY, $AISELITEMS)
$_G_ARRAYDISPLAY_BUSERFUNC = FALSE
__ARRAYDISPLAY_CLEANUP($HGUI, $ICOORDMODE, $IONEVENTMODE, $_ICALLERERROR, $_ICALLEREXTENDED, $P__ARRAYDISPLAY_NOTIFYHANDLER)
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, -1)
CASE $IDEXIT_SCRIPT
GUIDELETE($HGUI)
EXIT
ENDSWITCH
ENDIF
WEND
#EndRegion GUI Handling events
__ARRAYDISPLAY_CLEANUP($HGUI, $ICOORDMODE, $IONEVENTMODE, $_ICALLERERROR, $_ICALLEREXTENDED, $P__ARRAYDISPLAY_NOTIFYHANDLER)
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, 1)
ENDFUNC
FUNC __ARRAYDISPLAY_CLEANUP($HGUI, $ICOORDMODE, $IONEVENTMODE, $_ICALLERERROR, $_ICALLEREXTENDED, $P__ARRAYDISPLAY_NOTIFYHANDLER)
DLLCALL("comctl32.dll", "bool", "RemoveWindowSubclass", "hwnd", $HGUI, "ptr", $P__ARRAYDISPLAY_NOTIFYHANDLER, "uint_ptr", 0)
$_G_ARRAYDISPLAY_AINDEX = 0
DIM $_G_ARRAYDISPLAY_AINDEXES[1]
GUIDELETE($HGUI)
OPT("GUICoordMode", $ICOORDMODE)
OPT("GUIOnEventMode", $IONEVENTMODE)
RETURN SETERROR($_ICALLERERROR, $_ICALLEREXTENDED, 1)
ENDFUNC
FUNC __ARRAYDISPLAY_NOTIFYHANDLER($HWND, $IMSG, $WPARAM, $LPARAM, $ISUBCLASSID, $PDATA)
IF $IMSG <> 78 THEN RETURN DLLCALL("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $HWND, "uint", $IMSG, "wparam", $WPARAM, "lparam", $LPARAM)[0]
LOCAL STATIC $TAGNMHDR = "struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct"
LOCAL STATIC $TAGNMLVDISPINFO = $TAGNMHDR & ";" & $_ARRAYCONSTANT_TAGLVITEM
LOCAL $TNMLVDISPINFO = DLLSTRUCTCREATE($TAGNMLVDISPINFO, $LPARAM)
SWITCH HWND(DLLSTRUCTGETDATA($TNMLVDISPINFO, "hWndFrom"))
CASE $_G_ARRAYDISPLAY_HLISTVIEW
SWITCH DLLSTRUCTGETDATA($TNMLVDISPINFO, "Code")
CASE -177
LOCAL STATIC $TTEXT = DLLSTRUCTCREATE("wchar[4096]"), $PTEXT = DLLSTRUCTGETPTR($TTEXT)
LOCAL $IITEM = DLLSTRUCTGETDATA($TNMLVDISPINFO, "Item")
LOCAL $IROW = ($_G_ARRAYDISPLAY_ISORTDIR = 1024) ? $_G_ARRAYDISPLAY_AINDEX[$IITEM] : $_G_ARRAYDISPLAY_AINDEX[$_G_ARRAYDISPLAY_NROWS - 1 - $IITEM]
LOCAL $ICOL = DLLSTRUCTGETDATA($TNMLVDISPINFO, "SubItem")
LOCAL $STEMP
IF $_G_ARRAYDISPLAY_IDISPLAYROW = 0 THEN
$STEMP = __ARRAYDISPLAY_GETDATA($IROW, $ICOL)
DLLSTRUCTSETDATA($TTEXT, 1, $STEMP)
DLLSTRUCTSETDATA($TNMLVDISPINFO, "Text", $PTEXT)
ELSE
IF $ICOL = 0 THEN
IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
LOCAL $SCAPTIONCPLT = ""
IF $IROW + $_G_ARRAYDISPLAY_IITEM_START < UBOUND($_G_ARRAYDISPLAY_ASHEADER) AND STRINGSTRIPWS($_G_ARRAYDISPLAY_ASHEADER[$IROW + $_G_ARRAYDISPLAY_IITEM_START], 1 + 2) <> "" THEN
$SCAPTIONCPLT = " (" & STRINGSTRIPWS($_G_ARRAYDISPLAY_ASHEADER[$IROW + $_G_ARRAYDISPLAY_IITEM_START], 1 + 2)
IF STRINGRIGHT($SCAPTIONCPLT, 1) = $ARRAYDISPLAY_NUMERICSORT THEN $SCAPTIONCPLT = STRINGTRIMRIGHT($SCAPTIONCPLT, 1)
$SCAPTIONCPLT &= ")"
ENDIF
DLLSTRUCTSETDATA($TTEXT, 1, "Col " & ($IROW + $_G_ARRAYDISPLAY_IITEM_START) & $SCAPTIONCPLT)
ELSE
DLLSTRUCTSETDATA($TTEXT, 1, $ARRAYDISPLAY_ROWPREFIX & " " & $IROW + $_G_ARRAYDISPLAY_IITEM_START)
ENDIF
DLLSTRUCTSETDATA($TNMLVDISPINFO, "Text", $PTEXT)
ELSE
$STEMP = __ARRAYDISPLAY_GETDATA($IROW, $ICOL - 1)
DLLSTRUCTSETDATA($TTEXT, 1, $STEMP)
DLLSTRUCTSETDATA($TNMLVDISPINFO, "Text", $PTEXT)
ENDIF
ENDIF
RETURN
ENDSWITCH
ENDSWITCH
RETURN DLLCALL("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $HWND, "uint", $IMSG, "wparam", $WPARAM, "lparam", $LPARAM)[0]
#forceref $ISUBCLASSID, $PDATA
ENDFUNC
FUNC __ARRAYDISPLAY_GETDATA($IROW, $ICOL)
LOCAL $STEMP
IF $_G_ARRAYDISPLAY_IDIMS = 2 THEN
$STEMP = $_G_ARRAYDISPLAY_AARRAY[$IROW][$ICOL]
ELSE
$STEMP = $_G_ARRAYDISPLAY_AARRAY[$IROW]
ENDIF
SWITCH VARGETTYPE($STEMP)
CASE "Array"
LOCAL $SSUBSCRIPT = ""
FOR $I = 1 TO UBOUND($STEMP, 0)
$SSUBSCRIPT = "[" & UBOUND($STEMP, $I) & "]"
NEXT
$STEMP = "{Array" & $SSUBSCRIPT & "}"
CASE "Map"
$STEMP = "{Map[" & UBOUND($STEMP) & "]}"
CASE "Object"
$STEMP = "{Object}"
ENDSWITCH
IF STRINGLEN($STEMP) > 4095 THEN $STEMP = STRINGLEFT($STEMP, 4095)
RETURN $STEMP
ENDFUNC
FUNC __ARRAYDISPLAY_SORTINDEXES($ICOLSTART, $ICOLEND = $ICOLSTART)
DIM $_G_ARRAYDISPLAY_AINDEX[$_G_ARRAYDISPLAY_NROWS]
IF $ICOLEND = -1 THEN
DIM $_G_ARRAYDISPLAY_AINDEXES[$_G_ARRAYDISPLAY_NCOLS + $_G_ARRAYDISPLAY_IDISPLAYROW + 1]
FOR $I = 0 TO $_G_ARRAYDISPLAY_NROWS - 1
$_G_ARRAYDISPLAY_AINDEX[$I] = $I
NEXT
$_G_ARRAYDISPLAY_AINDEXES[0] = $_G_ARRAYDISPLAY_AINDEX
ENDIF
IF $ICOLSTART = -1 THEN
$ICOLSTART = 1
$ICOLEND = $_G_ARRAYDISPLAY_NCOLS
ENDIF
IF $ICOLSTART THEN
LOCAL $TINDEX
FOR $I = $ICOLSTART TO $ICOLEND
$TINDEX = __ARRAYDISPLAY_GETSORTCOLSTRUCT($_G_ARRAYDISPLAY_AARRAY, $I - 1)
FOR $J = 0 TO $_G_ARRAYDISPLAY_NROWS - 1
$_G_ARRAYDISPLAY_AINDEX[$J] = DLLSTRUCTGETDATA($TINDEX, 1, $J + 1)
NEXT
$_G_ARRAYDISPLAY_AINDEXES[$I] = $_G_ARRAYDISPLAY_AINDEX
NEXT
ENDIF
ENDFUNC
FUNC __ARRAYDISPLAY_GETSORTCOLSTRUCT(CONST BYREF $AARRAY, $ICOL)
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) < 1 OR UBOUND($AARRAY, $UBOUND_DIMENSIONS) > 2 THEN
RETURN SETERROR(6, 0, 0)
ENDIF
RETURN __ARRAYDISPLAY_SORTARRAYSTRUCT($AARRAY, $ICOL)
ENDFUNC
FUNC __ARRAYDISPLAY_SORTARRAYSTRUCT(CONST BYREF $AARRAY, $ICOL)
LOCAL $IDIMS = UBOUND($AARRAY, $UBOUND_DIMENSIONS)
LOCAL $TINDEX = DLLSTRUCTCREATE("uint[" & $_G_ARRAYDISPLAY_NROWS & "]")
LOCAL $PINDEX = DLLSTRUCTGETPTR($TINDEX)
STATIC $HDLL = DLLOPEN("kernel32.dll")
STATIC $HDLLCOMP = DLLOPEN("shlwapi.dll")
LOCAL $LO, $HI, $MI, $R, $NVAL1, $NVAL2
FOR $I = 1 TO $_G_ARRAYDISPLAY_NROWS - 1
$LO = 0
$HI = $I - 1
DO
$MI = INT(($LO + $HI) / 2)
IF NOT $_G_ARRAYDISPLAY_ITRANSPOSE AND $_G_ARRAYDISPLAY_ANUMERICSORT[$ICOL] THEN
IF $IDIMS = 1 THEN
$NVAL1 = NUMBER($AARRAY[$I])
$NVAL2 = NUMBER($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)])
ELSE
$NVAL1 = NUMBER($AARRAY[$I][$ICOL])
$NVAL2 = NUMBER($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)][$ICOL])
ENDIF
$R = $NVAL1 < $NVAL2 ? -1 : $NVAL1 > $NVAL2 ? 1 : 0
ELSE
IF $IDIMS = 1 THEN
$R = DLLCALL($HDLLCOMP, "int", "StrCmpLogicalW", "wstr", STRING($AARRAY[$I]), "wstr", STRING($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)]))[0]
ELSE
$R = DLLCALL($HDLLCOMP, "int", "StrCmpLogicalW", "wstr", STRING($AARRAY[$I][$ICOL]), "wstr", STRING($AARRAY[DLLSTRUCTGETDATA($TINDEX, 1, $MI + 1)][$ICOL]))[0]
ENDIF
ENDIF
SWITCH $R
CASE -1
$HI = $MI - 1
CASE 1
$LO = $MI + 1
CASE 0
EXITLOOP
ENDSWITCH
UNTIL $LO > $HI
DLLCALL($HDLL, "none", "RtlMoveMemory", "struct*", $PINDEX + ($MI + 1) * 4, "struct*", $PINDEX + $MI * 4, "ulong_ptr", ($I - $MI) * 4)
DLLSTRUCTSETDATA($TINDEX, 1, $I, $MI + 1 + ($LO = $MI + 1))
NEXT
RETURN $TINDEX
ENDFUNC
FUNC __ARRAYDISPLAY_CREATESUBARRAY()
LOCAL $NROWS = $_G_ARRAYDISPLAY_IITEM_END - $_G_ARRAYDISPLAY_IITEM_START + 1
LOCAL $NCOLS = $_G_ARRAYDISPLAY_ISUBITEM_END - $_G_ARRAYDISPLAY_ISUBITEM_START + 1
LOCAL $IROW = -1, $ICOL, $ITEMP, $ATEMP
IF $_G_ARRAYDISPLAY_ITRANSPOSE THEN
DIM $ATEMP[$NCOLS][$NROWS]
FOR $I = $_G_ARRAYDISPLAY_IITEM_START TO $_G_ARRAYDISPLAY_IITEM_END
$IROW += 1
$ICOL = -1
FOR $J = $_G_ARRAYDISPLAY_ISUBITEM_START TO $_G_ARRAYDISPLAY_ISUBITEM_END
$ICOL += 1
$ATEMP[$ICOL][$IROW] = $_G_ARRAYDISPLAY_AARRAY[$I][$J]
NEXT
NEXT
$ITEMP = $_G_ARRAYDISPLAY_IITEM_START
$_G_ARRAYDISPLAY_IITEM_START = $_G_ARRAYDISPLAY_ISUBITEM_START
$_G_ARRAYDISPLAY_ISUBITEM_START = $ITEMP
$ITEMP = $_G_ARRAYDISPLAY_IITEM_END
$_G_ARRAYDISPLAY_IITEM_END = $_G_ARRAYDISPLAY_ISUBITEM_END
$_G_ARRAYDISPLAY_ISUBITEM_END = $ITEMP
$_G_ARRAYDISPLAY_NROWS = $NCOLS
$_G_ARRAYDISPLAY_NCOLS = $NROWS
ELSE
IF $_G_ARRAYDISPLAY_IDIMS = 1 THEN
DIM $ATEMP[$NROWS]
FOR $I = $_G_ARRAYDISPLAY_IITEM_START TO $_G_ARRAYDISPLAY_IITEM_END
$IROW += 1
$ATEMP[$IROW] = $_G_ARRAYDISPLAY_AARRAY[$I]
NEXT
ELSE
DIM $ATEMP[$NROWS][$NCOLS]
FOR $I = $_G_ARRAYDISPLAY_IITEM_START TO $_G_ARRAYDISPLAY_IITEM_END
$IROW += 1
$ICOL = -1
FOR $J = $_G_ARRAYDISPLAY_ISUBITEM_START TO $_G_ARRAYDISPLAY_ISUBITEM_END
$ICOL += 1
$ATEMP[$IROW][$ICOL] = $_G_ARRAYDISPLAY_AARRAY[$I][$J]
NEXT
NEXT
$_G_ARRAYDISPLAY_NCOLS = $NCOLS
ENDIF
$_G_ARRAYDISPLAY_NROWS = $NROWS
ENDIF
RETURN $ATEMP
ENDFUNC
FUNC __ARRAYDISPLAY_HEADERSETITEMFORMAT($HWND, $IINDEX, $IFORMAT)
LOCAL STATIC $THDITEM = DLLSTRUCTCREATE("uint Mask;int XY;ptr Text;handle hBMP;int TextMax;int Fmt;lparam Param;int Image;int Order;uint Type;ptr pFilter;uint State")
DLLSTRUCTSETDATA($THDITEM, "Mask", 4)
DLLSTRUCTSETDATA($THDITEM, "Fmt", $IFORMAT)
LOCAL $ARESULT = DLLCALL("user32.dll", "lresult", "SendMessageW", "hwnd", $HWND, "uint", 4620, "wparam", $IINDEX, "struct*", $THDITEM)
RETURN $ARESULT[0] <> 0
ENDFUNC
FUNC __ARRAYDISPLAY_GETITEMTEXT($IDLISTVIEW, $IINDEX, $ISUBITEM = 0)
LOCAL $TBUFFER = DLLSTRUCTCREATE("wchar Text[4096]")
LOCAL $PBUFFER = DLLSTRUCTGETPTR($TBUFFER)
LOCAL $TITEM = DLLSTRUCTCREATE($_ARRAYCONSTANT_TAGLVITEM)
DLLSTRUCTSETDATA($TITEM, "SubItem", $ISUBITEM)
DLLSTRUCTSETDATA($TITEM, "TextMax", 4096)
DLLSTRUCTSETDATA($TITEM, "Text", $PBUFFER)
IF ISHWND($IDLISTVIEW) THEN
DLLCALL("user32.dll", "lresult", "SendMessageW", "hwnd", $IDLISTVIEW, "uint", 4211, "wparam", $IINDEX, "struct*", $TITEM)
ELSE
LOCAL $PITEM = DLLSTRUCTGETPTR($TITEM)
GUICTRLSENDMSG($IDLISTVIEW, 4211, $IINDEX, $PITEM)
ENDIF
RETURN DLLSTRUCTGETDATA($TBUFFER, "Text")
ENDFUNC
FUNC __ARRAYDISPLAY_GETITEMTEXTSTRINGSELECTED($IDLISTVIEW, $IITEM, $IFIRSTCOL)
LOCAL $SROW = "", $SSEPARATORCHAR = OPT("GUIDataSeparatorChar")
LOCAL $ISELECTED = $IITEM
LOCAL $HHEADER = HWND(GUICTRLSENDMSG($IDLISTVIEW, 4127, 0, 0))
LOCAL $NCOL = DLLCALL("user32.dll", "lresult", "SendMessageW", "hwnd", $HHEADER, "uint", 4608, "wparam", 0, "lparam", 0)[0]
FOR $X = $IFIRSTCOL TO $NCOL - 1
$SROW &= __ARRAYDISPLAY_GETITEMTEXT($IDLISTVIEW, $ISELECTED, $X) & $SSEPARATORCHAR
NEXT
RETURN STRINGTRIMRIGHT($SROW, 1)
ENDFUNC
FUNC __ARRAYDISPLAY_JUSTIFYCOLUMN($IDLISTVIEW, $IINDEX, $IALIGN = -1)
LOCAL $TCOLUMN = DLLSTRUCTCREATE("uint Mask;int Fmt;int CX;ptr Text;int TextMax;int SubItem;int Image;int Order;int cxMin;int cxDefault;int cxIdeal")
IF $IALIGN < 0 OR $IALIGN > 2 THEN $IALIGN = 0
DLLSTRUCTSETDATA($TCOLUMN, "Mask", 1)
DLLSTRUCTSETDATA($TCOLUMN, "Fmt", $IALIGN)
LOCAL $PCOLUMN = DLLSTRUCTGETPTR($TCOLUMN)
LOCAL $IRET = GUICTRLSENDMSG($IDLISTVIEW, 4192, $IINDEX, $PCOLUMN)
RETURN $IRET <> 0
ENDFUNC
GLOBAL ENUM $ARRAYFILL_FORCE_DEFAULT, $ARRAYFILL_FORCE_SINGLEITEM, $ARRAYFILL_FORCE_INT, $ARRAYFILL_FORCE_NUMBER, $ARRAYFILL_FORCE_PTR, $ARRAYFILL_FORCE_HWND, $ARRAYFILL_FORCE_STRING, $ARRAYFILL_FORCE_BOOLEAN
GLOBAL ENUM $ARRAYUNIQUE_NOCOUNT, $ARRAYUNIQUE_COUNT
GLOBAL ENUM $ARRAYUNIQUE_AUTO, $ARRAYUNIQUE_FORCE32, $ARRAYUNIQUE_FORCE64, $ARRAYUNIQUE_MATCH, $ARRAYUNIQUE_DISTINCT
FUNC _ARRAYADD(BYREF $AARRAY, $VVALUE, $ISTART = 0, $SDELIM_ITEM = "|", $SDELIM_ROW = @CRLF, $IFORCE = $ARRAYFILL_FORCE_DEFAULT)
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $SDELIM_ITEM = DEFAULT THEN $SDELIM_ITEM = "|"
IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
IF $IFORCE = DEFAULT THEN $IFORCE = $ARRAYFILL_FORCE_DEFAULT
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
LOCAL $HDATATYPE = 0
SWITCH $IFORCE
CASE $ARRAYFILL_FORCE_INT
$HDATATYPE = INT
CASE $ARRAYFILL_FORCE_NUMBER
$HDATATYPE = NUMBER
CASE $ARRAYFILL_FORCE_PTR
$HDATATYPE = PTR
CASE $ARRAYFILL_FORCE_HWND
$HDATATYPE = HWND
CASE $ARRAYFILL_FORCE_STRING
$HDATATYPE = STRING
CASE $ARRAYFILL_FORCE_BOOLEAN
$HDATATYPE = "Boolean"
ENDSWITCH
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
IF $IFORCE = $ARRAYFILL_FORCE_SINGLEITEM THEN
REDIM $AARRAY[$IDIM_1 + 1]
$AARRAY[$IDIM_1] = $VVALUE
RETURN $IDIM_1
ENDIF
IF ISARRAY($VVALUE) THEN
IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(5, 0, -1)
$HDATATYPE = 0
ELSE
LOCAL $ATMP = STRINGSPLIT($VVALUE, $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
IF UBOUND($ATMP, $UBOUND_ROWS) = 1 THEN
$ATMP[0] = $VVALUE
ENDIF
$VVALUE = $ATMP
ENDIF
LOCAL $IADD = UBOUND($VVALUE, $UBOUND_ROWS)
REDIM $AARRAY[$IDIM_1 + $IADD]
FOR $I = 0 TO $IADD - 1
IF STRING($HDATATYPE) = "Boolean" THEN
SWITCH $VVALUE[$I]
CASE "True", "1"
$AARRAY[$IDIM_1 + $I] = TRUE
CASE "False", "0", ""
$AARRAY[$IDIM_1 + $I] = FALSE
ENDSWITCH
ELSEIF ISFUNC($HDATATYPE) THEN
$AARRAY[$IDIM_1 + $I] = $HDATATYPE($VVALUE[$I])
ELSE
$AARRAY[$IDIM_1 + $I] = $VVALUE[$I]
ENDIF
NEXT
RETURN $IDIM_1 + $IADD - 1
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
IF $ISTART < 0 OR $ISTART > $IDIM_2 - 1 THEN RETURN SETERROR(4, 0, -1)
LOCAL $IVALDIM_1, $IVALDIM_2 = 0, $ICOLCOUNT
IF ISARRAY($VVALUE) THEN
IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 2 THEN RETURN SETERROR(5, 0, -1)
$IVALDIM_1 = UBOUND($VVALUE, $UBOUND_ROWS)
$IVALDIM_2 = UBOUND($VVALUE, $UBOUND_COLUMNS)
$HDATATYPE = 0
ELSE
LOCAL $ASPLIT_1 = STRINGSPLIT($VVALUE, $SDELIM_ROW, $STR_NOCOUNT + $STR_ENTIRESPLIT)
$IVALDIM_1 = UBOUND($ASPLIT_1, $UBOUND_ROWS)
LOCAL $ATMP[$IVALDIM_1][0], $ASPLIT_2
FOR $I = 0 TO $IVALDIM_1 - 1
$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
$ICOLCOUNT = UBOUND($ASPLIT_2)
IF $ICOLCOUNT > $IVALDIM_2 THEN
$IVALDIM_2 = $ICOLCOUNT
REDIM $ATMP[$IVALDIM_1][$IVALDIM_2]
ENDIF
FOR $J = 0 TO $ICOLCOUNT - 1
$ATMP[$I][$J] = $ASPLIT_2[$J]
NEXT
NEXT
$VVALUE = $ATMP
ENDIF
IF UBOUND($VVALUE, $UBOUND_COLUMNS) + $ISTART > UBOUND($AARRAY, $UBOUND_COLUMNS) THEN RETURN SETERROR(3, 0, -1)
REDIM $AARRAY[$IDIM_1 + $IVALDIM_1][$IDIM_2]
FOR $IWRITETO_INDEX = 0 TO $IVALDIM_1 - 1
FOR $J = 0 TO $IDIM_2 - 1
IF $J < $ISTART THEN
$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = ""
ELSEIF $J - $ISTART > $IVALDIM_2 - 1 THEN
$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = ""
ELSE
IF STRING($HDATATYPE) = "Boolean" THEN
SWITCH $VVALUE[$IWRITETO_INDEX][$J - $ISTART]
CASE "True", "1"
$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = TRUE
CASE "False", "0", ""
$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = FALSE
ENDSWITCH
ELSEIF ISFUNC($HDATATYPE) THEN
$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = $HDATATYPE($VVALUE[$IWRITETO_INDEX][$J - $ISTART])
ELSE
$AARRAY[$IWRITETO_INDEX + $IDIM_1][$J] = $VVALUE[$IWRITETO_INDEX][$J - $ISTART]
ENDIF
ENDIF
NEXT
NEXT
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN UBOUND($AARRAY, $UBOUND_ROWS) - 1
ENDFUNC
FUNC _ARRAYBINARYSEARCH(CONST BYREF $AARRAY, $VVALUE, $ISTART = 0, $IEND = 0, $ICOLUMN = 0)
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $IEND = DEFAULT THEN $IEND = 0
IF $ICOLUMN = DEFAULT THEN $ICOLUMN = 0
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
IF $IDIM_1 = 0 THEN RETURN SETERROR(6, 0, -1)
IF $IEND < 1 OR $IEND > $IDIM_1 - 1 THEN $IEND = $IDIM_1 - 1
IF $ISTART < 0 THEN $ISTART = 0
IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
LOCAL $IMID = INT(($IEND + $ISTART) / 2)
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
IF $AARRAY[$ISTART] > $VVALUE OR $AARRAY[$IEND] < $VVALUE THEN RETURN SETERROR(2, 0, -1)
WHILE $ISTART <= $IMID AND $VVALUE <> $AARRAY[$IMID]
IF $VVALUE < $AARRAY[$IMID] THEN
$IEND = $IMID - 1
ELSE
$ISTART = $IMID + 1
ENDIF
$IMID = INT(($IEND + $ISTART) / 2)
WEND
IF $ISTART > $IEND THEN RETURN SETERROR(3, 0, -1)
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
IF $ICOLUMN < 0 OR $ICOLUMN > $IDIM_2 THEN RETURN SETERROR(7, 0, -1)
IF $AARRAY[$ISTART][$ICOLUMN] > $VVALUE OR $AARRAY[$IEND][$ICOLUMN] < $VVALUE THEN RETURN SETERROR(2, 0, -1)
WHILE $ISTART <= $IMID AND $VVALUE <> $AARRAY[$IMID][$ICOLUMN]
IF $VVALUE < $AARRAY[$IMID][$ICOLUMN] THEN
$IEND = $IMID - 1
ELSE
$ISTART = $IMID + 1
ENDIF
$IMID = INT(($IEND + $ISTART) / 2)
WEND
IF $ISTART > $IEND THEN RETURN SETERROR(3, 0, -1)
CASE ELSE
RETURN SETERROR(5, 0, -1)
ENDSWITCH
RETURN $IMID
ENDFUNC
FUNC _ARRAYCOLDELETE(BYREF $AARRAY, $ICOLUMN, $BCONVERT = FALSE)
IF $BCONVERT = DEFAULT THEN $BCONVERT = FALSE
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 2 THEN RETURN SETERROR(2, 0, -1)
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
SWITCH $IDIM_2
CASE 2
IF $ICOLUMN < 0 OR $ICOLUMN > 1 THEN RETURN SETERROR(3, 0, -1)
IF $BCONVERT THEN
LOCAL $ATEMPARRAY[$IDIM_1]
FOR $I = 0 TO $IDIM_1 - 1
$ATEMPARRAY[$I] = $AARRAY[$I][(NOT $ICOLUMN)]
NEXT
$AARRAY = $ATEMPARRAY
ELSE
CONTINUECASE
ENDIF
CASE ELSE
IF $ICOLUMN < 0 OR $ICOLUMN > $IDIM_2 - 1 THEN RETURN SETERROR(3, 0, -1)
FOR $I = 0 TO $IDIM_1 - 1
FOR $J = $ICOLUMN TO $IDIM_2 - 2
$AARRAY[$I][$J] = $AARRAY[$I][$J + 1]
NEXT
NEXT
REDIM $AARRAY[$IDIM_1][$IDIM_2 - 1]
ENDSWITCH
RETURN UBOUND($AARRAY, $UBOUND_COLUMNS)
ENDFUNC
FUNC _ARRAYCOLINSERT(BYREF $AARRAY, $ICOLUMN)
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
LOCAL $ATEMPARRAY[$IDIM_1][2]
SWITCH $ICOLUMN
CASE 0, 1
FOR $I = 0 TO $IDIM_1 - 1
$ATEMPARRAY[$I][(NOT $ICOLUMN)] = $AARRAY[$I]
NEXT
CASE ELSE
RETURN SETERROR(3, 0, -1)
ENDSWITCH
$AARRAY = $ATEMPARRAY
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
IF $ICOLUMN < 0 OR $ICOLUMN > $IDIM_2 THEN RETURN SETERROR(3, 0, -1)
REDIM $AARRAY[$IDIM_1][$IDIM_2 + 1]
FOR $I = 0 TO $IDIM_1 - 1
FOR $J = $IDIM_2 TO $ICOLUMN + 1 STEP -1
$AARRAY[$I][$J] = $AARRAY[$I][$J - 1]
NEXT
$AARRAY[$I][$ICOLUMN] = ""
NEXT
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN UBOUND($AARRAY, $UBOUND_COLUMNS)
ENDFUNC
FUNC _ARRAYCOMBINATIONS(CONST BYREF $AARRAY, $ISET, $SDELIMITER = "")
IF $SDELIMITER = DEFAULT THEN $SDELIMITER = ""
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(2, 0, 0)
LOCAL $IN = UBOUND($AARRAY)
LOCAL $IR = $ISET
LOCAL $AIDX[$IR]
FOR $I = 0 TO $IR - 1
$AIDX[$I] = $I
NEXT
LOCAL $ITOTAL = __ARRAY_COMBINATIONS($IN, $IR)
LOCAL $ILEFT = $ITOTAL
LOCAL $ARESULT[$ITOTAL + 1]
$ARESULT[0] = $ITOTAL
LOCAL $ICOUNT = 1
WHILE $ILEFT > 0
__ARRAY_GETNEXT($IN, $IR, $ILEFT, $ITOTAL, $AIDX)
FOR $I = 0 TO $ISET - 1
$ARESULT[$ICOUNT] &= $AARRAY[$AIDX[$I]] & $SDELIMITER
NEXT
IF $SDELIMITER <> "" THEN $ARESULT[$ICOUNT] = STRINGTRIMRIGHT($ARESULT[$ICOUNT], 1)
$ICOUNT += 1
WEND
RETURN $ARESULT
ENDFUNC
FUNC _ARRAYCONCATENATE(BYREF $AARRAYTARGET, CONST BYREF $AARRAYSOURCE, $ISTART = 0)
IF $ISTART = DEFAULT THEN $ISTART = 0
IF NOT ISARRAY($AARRAYTARGET) THEN RETURN SETERROR(1, 0, -1)
IF NOT ISARRAY($AARRAYSOURCE) THEN RETURN SETERROR(2, 0, -1)
LOCAL $IDIM_TOTAL_TGT = UBOUND($AARRAYTARGET, $UBOUND_DIMENSIONS)
LOCAL $IDIM_TOTAL_SRC = UBOUND($AARRAYSOURCE, $UBOUND_DIMENSIONS)
LOCAL $IDIM_1_TGT = UBOUND($AARRAYTARGET, $UBOUND_ROWS)
LOCAL $IDIM_1_SRC = UBOUND($AARRAYSOURCE, $UBOUND_ROWS)
IF $ISTART < 0 OR $ISTART > $IDIM_1_SRC - 1 THEN RETURN SETERROR(6, 0, -1)
SWITCH $IDIM_TOTAL_TGT
CASE 1
IF $IDIM_TOTAL_SRC <> 1 THEN RETURN SETERROR(4, 0, -1)
REDIM $AARRAYTARGET[$IDIM_1_TGT + $IDIM_1_SRC - $ISTART]
FOR $I = $ISTART TO $IDIM_1_SRC - 1
$AARRAYTARGET[$IDIM_1_TGT + $I - $ISTART] = $AARRAYSOURCE[$I]
NEXT
CASE 2
IF $IDIM_TOTAL_SRC <> 2 THEN RETURN SETERROR(4, 0, -1)
LOCAL $IDIM_2_TGT = UBOUND($AARRAYTARGET, $UBOUND_COLUMNS)
IF UBOUND($AARRAYSOURCE, $UBOUND_COLUMNS) <> $IDIM_2_TGT THEN RETURN SETERROR(5, 0, -1)
REDIM $AARRAYTARGET[$IDIM_1_TGT + $IDIM_1_SRC - $ISTART][$IDIM_2_TGT]
FOR $I = $ISTART TO $IDIM_1_SRC - 1
FOR $J = 0 TO $IDIM_2_TGT - 1
$AARRAYTARGET[$IDIM_1_TGT + $I - $ISTART][$J] = $AARRAYSOURCE[$I][$J]
NEXT
NEXT
CASE ELSE
RETURN SETERROR(3, 0, -1)
ENDSWITCH
RETURN UBOUND($AARRAYTARGET, $UBOUND_ROWS)
ENDFUNC
FUNC _ARRAYDELETE(BYREF $AARRAY, $VRANGE)
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
IF ISARRAY($VRANGE) THEN
IF UBOUND($VRANGE, $UBOUND_DIMENSIONS) <> 1 OR UBOUND($VRANGE, $UBOUND_ROWS) < 2 THEN RETURN SETERROR(4, 0, -1)
ELSE
LOCAL $INUMBER, $ASPLIT_1, $ASPLIT_2
$VRANGE = STRINGSTRIPWS($VRANGE, 8)
$ASPLIT_1 = STRINGSPLIT($VRANGE, ";")
$VRANGE = ""
FOR $I = 1 TO $ASPLIT_1[0]
IF NOT STRINGREGEXP($ASPLIT_1[$I], "^\d+(-\d+)?$") THEN RETURN SETERROR(3, 0, -1)
$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], "-")
SWITCH $ASPLIT_2[0]
CASE 1
$VRANGE &= $ASPLIT_2[1] & ";"
CASE 2
IF NUMBER($ASPLIT_2[2]) >= NUMBER($ASPLIT_2[1]) THEN
$INUMBER = $ASPLIT_2[1] - 1
DO
$INUMBER += 1
$VRANGE &= $INUMBER & ";"
UNTIL $INUMBER = $ASPLIT_2[2]
ENDIF
ENDSWITCH
NEXT
$VRANGE = STRINGSPLIT(STRINGTRIMRIGHT($VRANGE, 1), ";")
ENDIF
FOR $I = 1 TO $VRANGE[0]
$VRANGE[$I] = NUMBER($VRANGE[$I])
NEXT
IF $VRANGE[1] < 0 OR $VRANGE[$VRANGE[0]] > $IDIM_1 THEN RETURN SETERROR(5, 0, -1)
LOCAL $ICOPYTO_INDEX = 0
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
FOR $I = 1 TO $VRANGE[0]
$AARRAY[$VRANGE[$I]] = CHRW(64177)
NEXT
FOR $IREADFROM_INDEX = 0 TO $IDIM_1
IF $AARRAY[$IREADFROM_INDEX] == CHRW(64177) THEN
CONTINUELOOP
ELSE
IF $IREADFROM_INDEX <> $ICOPYTO_INDEX THEN
$AARRAY[$ICOPYTO_INDEX] = $AARRAY[$IREADFROM_INDEX]
ENDIF
$ICOPYTO_INDEX += 1
ENDIF
NEXT
REDIM $AARRAY[$IDIM_1 - $VRANGE[0] + 1]
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
FOR $I = 1 TO $VRANGE[0]
$AARRAY[$VRANGE[$I]][0] = CHRW(64177)
NEXT
FOR $IREADFROM_INDEX = 0 TO $IDIM_1
IF $AARRAY[$IREADFROM_INDEX][0] == CHRW(64177) THEN
CONTINUELOOP
ELSE
IF $IREADFROM_INDEX <> $ICOPYTO_INDEX THEN
FOR $J = 0 TO $IDIM_2
$AARRAY[$ICOPYTO_INDEX][$J] = $AARRAY[$IREADFROM_INDEX][$J]
NEXT
ENDIF
$ICOPYTO_INDEX += 1
ENDIF
NEXT
REDIM $AARRAY[$IDIM_1 - $VRANGE[0] + 1][$IDIM_2 + 1]
CASE ELSE
RETURN SETERROR(2, 0, FALSE)
ENDSWITCH
RETURN UBOUND($AARRAY, $UBOUND_ROWS)
ENDFUNC
FUNC _ARRAYDISPLAY(CONST BYREF $AARRAY, $STITLE = DEFAULT, $SARRAYRANGE = DEFAULT, $IFLAGS = DEFAULT, $VUSER_SEPARATOR = DEFAULT, $SHEADER = DEFAULT, $IDESIRED_COLWIDTH = DEFAULT)
#forceref $VUSER_SEPARATOR
LOCAL $IRET = __ARRAYDISPLAY_SHARE($AARRAY, $STITLE, $SARRAYRANGE, $IFLAGS, DEFAULT, $SHEADER, $IDESIRED_COLWIDTH, 0, FALSE)
RETURN SETERROR(@ERROR, @EXTENDED, $IRET)
ENDFUNC
FUNC _ARRAYEXTRACT(CONST BYREF $AARRAY, $ISTART_ROW = -1, $IEND_ROW = -1, $ISTART_COL = -1, $IEND_COL = -1)
IF $ISTART_ROW = DEFAULT THEN $ISTART_ROW = -1
IF $IEND_ROW = DEFAULT THEN $IEND_ROW = -1
IF $ISTART_COL = DEFAULT THEN $ISTART_COL = -1
IF $IEND_COL = DEFAULT THEN $IEND_COL = -1
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
IF $IEND_ROW = -1 THEN $IEND_ROW = $IDIM_1
IF $ISTART_ROW = -1 THEN $ISTART_ROW = 0
IF $ISTART_ROW < -1 OR $IEND_ROW < -1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART_ROW > $IDIM_1 OR $IEND_ROW > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART_ROW > $IEND_ROW THEN RETURN SETERROR(4, 0, -1)
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
LOCAL $ARETARRAY[$IEND_ROW - $ISTART_ROW + 1]
FOR $I = 0 TO $IEND_ROW - $ISTART_ROW
$ARETARRAY[$I] = $AARRAY[$I + $ISTART_ROW]
NEXT
RETURN $ARETARRAY
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
IF $IEND_COL = -1 THEN $IEND_COL = $IDIM_2
IF $ISTART_COL = -1 THEN $ISTART_COL = 0
IF $ISTART_COL < -1 OR $IEND_COL < -1 THEN RETURN SETERROR(5, 0, -1)
IF $ISTART_COL > $IDIM_2 OR $IEND_COL > $IDIM_2 THEN RETURN SETERROR(5, 0, -1)
IF $ISTART_COL > $IEND_COL THEN RETURN SETERROR(6, 0, -1)
IF $ISTART_COL = $IEND_COL THEN
LOCAL $ARETARRAY[$IEND_ROW - $ISTART_ROW + 1]
ELSE
LOCAL $ARETARRAY[$IEND_ROW - $ISTART_ROW + 1][$IEND_COL - $ISTART_COL + 1]
ENDIF
FOR $I = 0 TO $IEND_ROW - $ISTART_ROW
FOR $J = 0 TO $IEND_COL - $ISTART_COL
IF $ISTART_COL = $IEND_COL THEN
$ARETARRAY[$I] = $AARRAY[$I + $ISTART_ROW][$J + $ISTART_COL]
ELSE
$ARETARRAY[$I][$J] = $AARRAY[$I + $ISTART_ROW][$J + $ISTART_COL]
ENDIF
NEXT
NEXT
RETURN $ARETARRAY
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN 1
ENDFUNC
FUNC _ARRAYFINDALL(CONST BYREF $AARRAY, $VVALUE, $ISTART = 0, $IEND = 0, $ICASE = 0, $ICOMPARE = 0, $ISUBITEM = 0, $BROW = FALSE)
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $IEND = DEFAULT THEN $IEND = 0
IF $ICASE = DEFAULT THEN $ICASE = 0
IF $ICOMPARE = DEFAULT THEN $ICOMPARE = 0
IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
IF $BROW = DEFAULT THEN $BROW = FALSE
$ISTART = _ARRAYSEARCH($AARRAY, $VVALUE, $ISTART, $IEND, $ICASE, $ICOMPARE, 1, $ISUBITEM, $BROW)
IF @ERROR THEN RETURN SETERROR(@ERROR, 0, -1)
LOCAL $IINDEX = 0, $AVRESULT[UBOUND($AARRAY, ($BROW ? $UBOUND_COLUMNS : $UBOUND_ROWS))]
DO
$AVRESULT[$IINDEX] = $ISTART
$IINDEX += 1
$ISTART = _ARRAYSEARCH($AARRAY, $VVALUE, $ISTART + 1, $IEND, $ICASE, $ICOMPARE, 1, $ISUBITEM, $BROW)
UNTIL @ERROR
REDIM $AVRESULT[$IINDEX]
RETURN $AVRESULT
ENDFUNC
FUNC _ARRAYFROMSTRING($SARRAYSTR, $SDELIM_COL = "|", $SDELIM_ROW = @CRLF, $BFORCE2D = FALSE, $ISTRIPWS = $STR_STRIPLEADING + $STR_STRIPTRAILING)
IF $SDELIM_COL = DEFAULT THEN $SDELIM_COL = "|"
IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
IF $BFORCE2D = DEFAULT THEN $BFORCE2D = FALSE
IF $ISTRIPWS = DEFAULT THEN $ISTRIPWS = $STR_STRIPLEADING + $STR_STRIPTRAILING
LOCAL $AROW, $ACOL = STRINGSPLIT($SARRAYSTR, $SDELIM_ROW, $STR_ENTIRESPLIT + $STR_NOCOUNT)
$AROW = STRINGSPLIT($ACOL[0], $SDELIM_COL, $STR_ENTIRESPLIT + $STR_NOCOUNT)
IF UBOUND($ACOL) = 1 AND NOT $BFORCE2D THEN
FOR $M = 0 TO UBOUND($AROW) - 1
$AROW[$M] = ($ISTRIPWS ? STRINGSTRIPWS($AROW[$M], $ISTRIPWS) : $AROW[$M])
NEXT
RETURN $AROW
ENDIF
LOCAL $ARET[UBOUND($ACOL)][UBOUND($AROW)]
FOR $N = 0 TO UBOUND($ACOL) - 1
$AROW = STRINGSPLIT($ACOL[$N], $SDELIM_COL, $STR_ENTIRESPLIT + $STR_NOCOUNT)
IF UBOUND($AROW) > UBOUND($ARET, 2) THEN RETURN SETERROR(1)
FOR $M = 0 TO UBOUND($AROW) - 1
$ARET[$N][$M] = ($ISTRIPWS ? STRINGSTRIPWS($AROW[$M], $ISTRIPWS) : $AROW[$M])
NEXT
NEXT
RETURN $ARET
ENDFUNC
FUNC _ARRAYINSERT(BYREF $AARRAY, $VRANGE, $VVALUE = "", $ISTART = 0, $SDELIM_ITEM = "|", $SDELIM_ROW = @CRLF, $IFORCE = $ARRAYFILL_FORCE_DEFAULT)
IF $VVALUE = DEFAULT THEN $VVALUE = ""
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $SDELIM_ITEM = DEFAULT THEN $SDELIM_ITEM = "|"
IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
IF $IFORCE = DEFAULT THEN $IFORCE = $ARRAYFILL_FORCE_DEFAULT
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
LOCAL $HDATATYPE = 0
SWITCH $IFORCE
CASE $ARRAYFILL_FORCE_INT
$HDATATYPE = INT
CASE $ARRAYFILL_FORCE_NUMBER
$HDATATYPE = NUMBER
CASE $ARRAYFILL_FORCE_PTR
$HDATATYPE = PTR
CASE $ARRAYFILL_FORCE_HWND
$HDATATYPE = HWND
CASE $ARRAYFILL_FORCE_STRING
$HDATATYPE = STRING
ENDSWITCH
LOCAL $ASPLIT_1, $ASPLIT_2
IF ISARRAY($VRANGE) THEN
IF UBOUND($VRANGE, $UBOUND_DIMENSIONS) <> 1 OR UBOUND($VRANGE, $UBOUND_ROWS) < 2 THEN RETURN SETERROR(4, 0, -1)
ELSE
LOCAL $INUMBER
$VRANGE = STRINGSTRIPWS($VRANGE, 8)
$ASPLIT_1 = STRINGSPLIT($VRANGE, ";")
$VRANGE = ""
FOR $I = 1 TO $ASPLIT_1[0]
IF NOT STRINGREGEXP($ASPLIT_1[$I], "^\d+(-\d+)?$") THEN RETURN SETERROR(3, 0, -1)
$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], "-")
SWITCH $ASPLIT_2[0]
CASE 1
$VRANGE &= $ASPLIT_2[1] & ";"
CASE 2
IF NUMBER($ASPLIT_2[2]) >= NUMBER($ASPLIT_2[1]) THEN
$INUMBER = $ASPLIT_2[1] - 1
DO
$INUMBER += 1
$VRANGE &= $INUMBER & ";"
UNTIL $INUMBER = $ASPLIT_2[2]
ENDIF
ENDSWITCH
NEXT
$VRANGE = STRINGSPLIT(STRINGTRIMRIGHT($VRANGE, 1), ";")
ENDIF
FOR $I = 1 TO $VRANGE[0]
$VRANGE[$I] = NUMBER($VRANGE[$I])
NEXT
IF $VRANGE[1] < 0 OR $VRANGE[$VRANGE[0]] > $IDIM_1 THEN RETURN SETERROR(5, 0, -1)
FOR $I = 2 TO $VRANGE[0]
IF $VRANGE[$I] < $VRANGE[$I - 1] THEN RETURN SETERROR(3, 0, -1)
NEXT
LOCAL $ICOPYTO_INDEX = $IDIM_1 + $VRANGE[0]
LOCAL $IINSERTPOINT_INDEX = $VRANGE[0]
LOCAL $IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
IF $IFORCE = $ARRAYFILL_FORCE_SINGLEITEM THEN
REDIM $AARRAY[$IDIM_1 + $VRANGE[0] + 1]
FOR $IREADFROMINDEX = $IDIM_1 TO 0 STEP -1
$AARRAY[$ICOPYTO_INDEX] = $AARRAY[$IREADFROMINDEX]
$ICOPYTO_INDEX -= 1
$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
WHILE $IREADFROMINDEX = $IINSERT_INDEX
$AARRAY[$ICOPYTO_INDEX] = $VVALUE
$ICOPYTO_INDEX -= 1
$IINSERTPOINT_INDEX -= 1
IF $IINSERTPOINT_INDEX < 1 THEN EXITLOOP 2
$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
WEND
NEXT
RETURN $IDIM_1 + $VRANGE[0] + 1
ENDIF
REDIM $AARRAY[$IDIM_1 + $VRANGE[0] + 1]
IF ISARRAY($VVALUE) THEN
IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(5, 0, -1)
$HDATATYPE = 0
ELSE
LOCAL $ATMP = STRINGSPLIT($VVALUE, $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
IF UBOUND($ATMP, $UBOUND_ROWS) = 1 THEN
$ATMP[0] = $VVALUE
$HDATATYPE = 0
ENDIF
$VVALUE = $ATMP
ENDIF
FOR $IREADFROMINDEX = $IDIM_1 TO 0 STEP -1
$AARRAY[$ICOPYTO_INDEX] = $AARRAY[$IREADFROMINDEX]
$ICOPYTO_INDEX -= 1
$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
WHILE $IREADFROMINDEX = $IINSERT_INDEX
IF $IINSERTPOINT_INDEX <= UBOUND($VVALUE, $UBOUND_ROWS) THEN
IF ISFUNC($HDATATYPE) THEN
$AARRAY[$ICOPYTO_INDEX] = $HDATATYPE($VVALUE[$IINSERTPOINT_INDEX - 1])
ELSE
$AARRAY[$ICOPYTO_INDEX] = $VVALUE[$IINSERTPOINT_INDEX - 1]
ENDIF
ELSE
$AARRAY[$ICOPYTO_INDEX] = ""
ENDIF
$ICOPYTO_INDEX -= 1
$IINSERTPOINT_INDEX -= 1
IF $IINSERTPOINT_INDEX = 0 THEN EXITLOOP 2
$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
WEND
NEXT
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
IF $ISTART < 0 OR $ISTART > $IDIM_2 - 1 THEN RETURN SETERROR(6, 0, -1)
LOCAL $IVALDIM_1, $IVALDIM_2
IF ISARRAY($VVALUE) THEN
IF UBOUND($VVALUE, $UBOUND_DIMENSIONS) <> 2 THEN RETURN SETERROR(7, 0, -1)
$IVALDIM_1 = UBOUND($VVALUE, $UBOUND_ROWS)
$IVALDIM_2 = UBOUND($VVALUE, $UBOUND_COLUMNS)
$HDATATYPE = 0
ELSE
$ASPLIT_1 = STRINGSPLIT($VVALUE, $SDELIM_ROW, $STR_NOCOUNT + $STR_ENTIRESPLIT)
$IVALDIM_1 = UBOUND($ASPLIT_1, $UBOUND_ROWS)
STRINGREPLACE($ASPLIT_1[0], $SDELIM_ITEM, "")
$IVALDIM_2 = @EXTENDED + 1
LOCAL $ATMP[$IVALDIM_1][$IVALDIM_2]
FOR $I = 0 TO $IVALDIM_1 - 1
$ASPLIT_2 = STRINGSPLIT($ASPLIT_1[$I], $SDELIM_ITEM, $STR_NOCOUNT + $STR_ENTIRESPLIT)
FOR $J = 0 TO $IVALDIM_2 - 1
$ATMP[$I][$J] = $ASPLIT_2[$J]
NEXT
NEXT
$VVALUE = $ATMP
ENDIF
IF UBOUND($VVALUE, $UBOUND_COLUMNS) + $ISTART > UBOUND($AARRAY, $UBOUND_COLUMNS) THEN RETURN SETERROR(8, 0, -1)
REDIM $AARRAY[$IDIM_1 + $VRANGE[0] + 1][$IDIM_2]
FOR $IREADFROMINDEX = $IDIM_1 TO 0 STEP -1
FOR $J = 0 TO $IDIM_2 - 1
$AARRAY[$ICOPYTO_INDEX][$J] = $AARRAY[$IREADFROMINDEX][$J]
NEXT
$ICOPYTO_INDEX -= 1
$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
WHILE $IREADFROMINDEX = $IINSERT_INDEX
FOR $J = 0 TO $IDIM_2 - 1
IF $J < $ISTART THEN
$AARRAY[$ICOPYTO_INDEX][$J] = ""
ELSEIF $J - $ISTART > $IVALDIM_2 - 1 THEN
$AARRAY[$ICOPYTO_INDEX][$J] = ""
ELSE
IF $IINSERTPOINT_INDEX - 1 < $IVALDIM_1 THEN
IF ISFUNC($HDATATYPE) THEN
$AARRAY[$ICOPYTO_INDEX][$J] = $HDATATYPE($VVALUE[$IINSERTPOINT_INDEX - 1][$J - $ISTART])
ELSE
$AARRAY[$ICOPYTO_INDEX][$J] = $VVALUE[$IINSERTPOINT_INDEX - 1][$J - $ISTART]
ENDIF
ELSE
$AARRAY[$ICOPYTO_INDEX][$J] = ""
ENDIF
ENDIF
NEXT
$ICOPYTO_INDEX -= 1
$IINSERTPOINT_INDEX -= 1
IF $IINSERTPOINT_INDEX = 0 THEN EXITLOOP 2
$IINSERT_INDEX = $VRANGE[$IINSERTPOINT_INDEX]
WEND
NEXT
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN UBOUND($AARRAY, $UBOUND_ROWS)
ENDFUNC
FUNC _ARRAYMAX(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
LOCAL $IRESULT = _ARRAYMAXINDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM)
IF @ERROR THEN RETURN SETERROR(@ERROR, 0, "")
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) = 1 THEN
RETURN $AARRAY[$IRESULT]
ELSE
RETURN $AARRAY[$IRESULT][$ISUBITEM]
ENDIF
ENDFUNC
FUNC _ARRAYMAXINDEX(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
IF $ICOMPNUMERIC = DEFAULT THEN $ICOMPNUMERIC = 0
IF $ISTART = DEFAULT THEN $ISTART = -1
IF $IEND = DEFAULT THEN $IEND = -1
IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
LOCAL $IRET = __ARRAY_MINMAXINDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM, __ARRAY_GREATERTHAN)
RETURN SETERROR(@ERROR, 0, $IRET)
ENDFUNC
FUNC _ARRAYMIN(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
LOCAL $IRESULT = _ARRAYMININDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM)
IF @ERROR THEN RETURN SETERROR(@ERROR, 0, "")
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) = 1 THEN
RETURN $AARRAY[$IRESULT]
ELSE
RETURN $AARRAY[$IRESULT][$ISUBITEM]
ENDIF
ENDFUNC
FUNC _ARRAYMININDEX(CONST BYREF $AARRAY, $ICOMPNUMERIC = 0, $ISTART = -1, $IEND = -1, $ISUBITEM = 0)
IF $ICOMPNUMERIC = DEFAULT THEN $ICOMPNUMERIC = 0
IF $ISTART = DEFAULT THEN $ISTART = -1
IF $IEND = DEFAULT THEN $IEND = -1
IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
LOCAL $IRET = __ARRAY_MINMAXINDEX($AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM, __ARRAY_LESSTHAN)
RETURN SETERROR(@ERROR, 0, $IRET)
ENDFUNC
FUNC _ARRAYPERMUTE(BYREF $AARRAY, $SDELIMITER = "")
IF $SDELIMITER = DEFAULT THEN $SDELIMITER = ""
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(2, 0, 0)
LOCAL $ISIZE = UBOUND($AARRAY), $IFACTORIAL = 1, $AIDX[$ISIZE], $ARESULT[1], $ICOUNT = 1
IF UBOUND($AARRAY) THEN
FOR $I = 0 TO $ISIZE - 1
$AIDX[$I] = $I
NEXT
FOR $I = $ISIZE TO 1 STEP -1
$IFACTORIAL *= $I
NEXT
REDIM $ARESULT[$IFACTORIAL + 1]
$ARESULT[0] = $IFACTORIAL
__ARRAY_EXETERINTERNAL($AARRAY, 0, $ISIZE, $SDELIMITER, $AIDX, $ARESULT, $ICOUNT)
ELSE
$ARESULT[0] = 0
ENDIF
RETURN $ARESULT
ENDFUNC
FUNC _ARRAYPOP(BYREF $AARRAY)
IF(NOT ISARRAY($AARRAY)) THEN RETURN SETERROR(1, 0, "")
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(2, 0, "")
LOCAL $IUBOUND = UBOUND($AARRAY) - 1
IF $IUBOUND = -1 THEN RETURN SETERROR(3, 0, "")
LOCAL $SLASTVAL = $AARRAY[$IUBOUND]
IF $IUBOUND > -1 THEN
REDIM $AARRAY[$IUBOUND]
ENDIF
RETURN $SLASTVAL
ENDFUNC
FUNC _ARRAYPUSH(BYREF $AARRAY, $VVALUE, $IDIRECTION = 0)
IF $IDIRECTION = DEFAULT THEN $IDIRECTION = 0
IF(NOT ISARRAY($AARRAY)) THEN RETURN SETERROR(1, 0, 0)
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(3, 0, 0)
LOCAL $IUBOUND = UBOUND($AARRAY) - 1
IF ISARRAY($VVALUE) THEN
LOCAL $IUBOUNDS = UBOUND($VVALUE)
IF($IUBOUNDS - 1) > $IUBOUND THEN RETURN SETERROR(2, 0, 0)
IF $IDIRECTION THEN
FOR $I = $IUBOUND TO $IUBOUNDS STEP -1
$AARRAY[$I] = $AARRAY[$I - $IUBOUNDS]
NEXT
FOR $I = 0 TO $IUBOUNDS - 1
$AARRAY[$I] = $VVALUE[$I]
NEXT
ELSE
FOR $I = 0 TO $IUBOUND - $IUBOUNDS
$AARRAY[$I] = $AARRAY[$I + $IUBOUNDS]
NEXT
FOR $I = 0 TO $IUBOUNDS - 1
$AARRAY[$I + $IUBOUND - $IUBOUNDS + 1] = $VVALUE[$I]
NEXT
ENDIF
ELSE
IF $IUBOUND > -1 THEN
IF $IDIRECTION THEN
FOR $I = $IUBOUND TO 1 STEP -1
$AARRAY[$I] = $AARRAY[$I - 1]
NEXT
$AARRAY[0] = $VVALUE
ELSE
FOR $I = 0 TO $IUBOUND - 1
$AARRAY[$I] = $AARRAY[$I + 1]
NEXT
$AARRAY[$IUBOUND] = $VVALUE
ENDIF
ENDIF
ENDIF
RETURN 1
ENDFUNC
FUNC _ARRAYREVERSE(BYREF $AARRAY, $ISTART = 0, $IEND = 0)
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $IEND = DEFAULT THEN $IEND = 0
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) <> 1 THEN RETURN SETERROR(3, 0, 0)
IF NOT UBOUND($AARRAY) THEN RETURN SETERROR(4, 0, 0)
LOCAL $VTMP, $IUBOUND = UBOUND($AARRAY) - 1
IF $IEND < 1 OR $IEND > $IUBOUND THEN $IEND = $IUBOUND
IF $ISTART < 0 THEN $ISTART = 0
IF $ISTART > $IEND THEN RETURN SETERROR(2, 0, 0)
FOR $I = $ISTART TO INT(($ISTART + $IEND - 1) / 2)
$VTMP = $AARRAY[$I]
$AARRAY[$I] = $AARRAY[$IEND]
$AARRAY[$IEND] = $VTMP
$IEND -= 1
NEXT
RETURN 1
ENDFUNC
FUNC _ARRAYSEARCH(CONST BYREF $AARRAY, $VVALUE, $ISTART = 0, $IEND = 0, $ICASE = 0, $ICOMPARE = 0, $IFORWARD = 1, $ISUBITEM = -1, $BROW = FALSE)
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $IEND = DEFAULT THEN $IEND = 0
IF $ICASE = DEFAULT THEN $ICASE = 0
IF $ICOMPARE = DEFAULT THEN $ICOMPARE = 0
IF $IFORWARD = DEFAULT THEN $IFORWARD = 1
IF $ISUBITEM = DEFAULT THEN $ISUBITEM = -1
IF $BROW = DEFAULT THEN $BROW = FALSE
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY) - 1
IF $IDIM_1 = -1 THEN RETURN SETERROR(3, 0, -1)
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
LOCAL $BCOMPTYPE = FALSE
IF $ICOMPARE = 2 THEN
$ICOMPARE = 0
$BCOMPTYPE = TRUE
ENDIF
IF $BROW THEN
IF UBOUND($AARRAY, $UBOUND_DIMENSIONS) = 1 THEN RETURN SETERROR(5, 0, -1)
IF $IEND < 1 OR $IEND > $IDIM_2 THEN $IEND = $IDIM_2
IF $ISTART < 0 THEN $ISTART = 0
IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
ELSE
IF $IEND < 1 OR $IEND > $IDIM_1 THEN $IEND = $IDIM_1
IF $ISTART < 0 THEN $ISTART = 0
IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
ENDIF
LOCAL $ISTEP = 1
IF NOT $IFORWARD THEN
LOCAL $ITMP = $ISTART
$ISTART = $IEND
$IEND = $ITMP
$ISTEP = -1
ENDIF
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
IF NOT $ICOMPARE THEN
IF NOT $ICASE THEN
FOR $I = $ISTART TO $IEND STEP $ISTEP
IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
IF $AARRAY[$I] = $VVALUE THEN RETURN $I
NEXT
ELSE
FOR $I = $ISTART TO $IEND STEP $ISTEP
IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
IF $AARRAY[$I] == $VVALUE THEN RETURN $I
NEXT
ENDIF
ELSE
FOR $I = $ISTART TO $IEND STEP $ISTEP
IF $ICOMPARE = 3 THEN
IF STRINGREGEXP($AARRAY[$I], $VVALUE) THEN RETURN $I
ELSE
IF STRINGINSTR($AARRAY[$I], $VVALUE, $ICASE) > 0 THEN RETURN $I
ENDIF
NEXT
ENDIF
CASE 2
LOCAL $IDIM_SUB
IF $BROW THEN
$IDIM_SUB = $IDIM_1
IF $ISUBITEM > $IDIM_SUB THEN $ISUBITEM = $IDIM_SUB
IF $ISUBITEM < 0 THEN
$ISUBITEM = 0
ELSE
$IDIM_SUB = $ISUBITEM
ENDIF
ELSE
$IDIM_SUB = $IDIM_2
IF $ISUBITEM > $IDIM_SUB THEN $ISUBITEM = $IDIM_SUB
IF $ISUBITEM < 0 THEN
$ISUBITEM = 0
ELSE
$IDIM_SUB = $ISUBITEM
ENDIF
ENDIF
FOR $J = $ISUBITEM TO $IDIM_SUB
IF NOT $ICOMPARE THEN
IF NOT $ICASE THEN
FOR $I = $ISTART TO $IEND STEP $ISTEP
IF $BROW THEN
IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$J][$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
IF $AARRAY[$J][$I] = $VVALUE THEN RETURN $I
ELSE
IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I][$J]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
IF $AARRAY[$I][$J] = $VVALUE THEN RETURN $I
ENDIF
NEXT
ELSE
FOR $I = $ISTART TO $IEND STEP $ISTEP
IF $BROW THEN
IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$J][$I]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
IF $AARRAY[$J][$I] == $VVALUE THEN RETURN $I
ELSE
IF $BCOMPTYPE AND VARGETTYPE($AARRAY[$I][$J]) <> VARGETTYPE($VVALUE) THEN CONTINUELOOP
IF $AARRAY[$I][$J] == $VVALUE THEN RETURN $I
ENDIF
NEXT
ENDIF
ELSE
FOR $I = $ISTART TO $IEND STEP $ISTEP
IF $ICOMPARE = 3 THEN
IF $BROW THEN
IF STRINGREGEXP($AARRAY[$J][$I], $VVALUE) THEN RETURN $I
ELSE
IF STRINGREGEXP($AARRAY[$I][$J], $VVALUE) THEN RETURN $I
ENDIF
ELSE
IF $BROW THEN
IF STRINGINSTR($AARRAY[$J][$I], $VVALUE, $ICASE) > 0 THEN RETURN $I
ELSE
IF STRINGINSTR($AARRAY[$I][$J], $VVALUE, $ICASE) > 0 THEN RETURN $I
ENDIF
ENDIF
NEXT
ENDIF
NEXT
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN SETERROR(6, 0, -1)
ENDFUNC
FUNC _ARRAYSHUFFLE(BYREF $AARRAY, $ISTART_ROW = 0, $IEND_ROW = 0, $ICOL = -1)
IF $ISTART_ROW = DEFAULT THEN $ISTART_ROW = 0
IF $IEND_ROW = DEFAULT THEN $IEND_ROW = 0
IF $ICOL = DEFAULT THEN $ICOL = -1
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS)
IF $IEND_ROW = 0 THEN $IEND_ROW = $IDIM_1 - 1
IF $ISTART_ROW < 0 OR $ISTART_ROW > $IDIM_1 - 1 THEN RETURN SETERROR(3, 0, -1)
IF $IEND_ROW < 1 OR $IEND_ROW > $IDIM_1 - 1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART_ROW > $IEND_ROW THEN RETURN SETERROR(4, 0, -1)
LOCAL $VTMP, $IRAND
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
FOR $I = $IEND_ROW TO $ISTART_ROW + 1 STEP -1
$IRAND = RANDOM($ISTART_ROW, $I, 1)
$VTMP = $AARRAY[$I]
$AARRAY[$I] = $AARRAY[$IRAND]
$AARRAY[$IRAND] = $VTMP
NEXT
RETURN 1
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS)
IF $ICOL < -1 OR $ICOL > $IDIM_2 - 1 THEN RETURN SETERROR(5, 0, -1)
LOCAL $ICOL_START, $ICOL_END
IF $ICOL = -1 THEN
$ICOL_START = 0
$ICOL_END = $IDIM_2 - 1
ELSE
$ICOL_START = $ICOL
$ICOL_END = $ICOL
ENDIF
FOR $I = $IEND_ROW TO $ISTART_ROW + 1 STEP -1
$IRAND = RANDOM($ISTART_ROW, $I, 1)
FOR $J = $ICOL_START TO $ICOL_END
$VTMP = $AARRAY[$I][$J]
$AARRAY[$I][$J] = $AARRAY[$IRAND][$J]
$AARRAY[$IRAND][$J] = $VTMP
NEXT
NEXT
RETURN 1
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
ENDFUNC
FUNC _ARRAYSORT(BYREF $AARRAY, $IDESCENDING = 0, $ISTART = 0, $IEND = 0, $ISUBITEM = 0, $IPIVOT = 0)
IF $IDESCENDING = DEFAULT THEN $IDESCENDING = 0
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $IEND = DEFAULT THEN $IEND = 0
IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
IF $IPIVOT = DEFAULT THEN $IPIVOT = 0
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
LOCAL $IUBOUND = UBOUND($AARRAY) - 1
IF $IUBOUND = -1 THEN RETURN SETERROR(5, 0, 0)
IF $IEND = DEFAULT THEN $IEND = 0
IF $IEND < 1 OR $IEND > $IUBOUND OR $IEND = DEFAULT THEN $IEND = $IUBOUND
IF $ISTART < 0 OR $ISTART = DEFAULT THEN $ISTART = 0
IF $ISTART > $IEND THEN RETURN SETERROR(2, 0, 0)
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
IF $IPIVOT THEN
__ARRAYDUALPIVOTSORT($AARRAY, $ISTART, $IEND)
ELSE
__ARRAYQUICKSORT1D($AARRAY, $ISTART, $IEND)
ENDIF
IF $IDESCENDING THEN _ARRAYREVERSE($AARRAY, $ISTART, $IEND)
CASE 2
IF $IPIVOT THEN RETURN SETERROR(6, 0, 0)
LOCAL $ISUBMAX = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
IF $ISUBITEM > $ISUBMAX THEN RETURN SETERROR(3, 0, 0)
IF $IDESCENDING THEN
$IDESCENDING = -1
ELSE
$IDESCENDING = 1
ENDIF
__ARRAYQUICKSORT2D($AARRAY, $IDESCENDING, $ISTART, $IEND, $ISUBITEM, $ISUBMAX)
CASE ELSE
RETURN SETERROR(4, 0, 0)
ENDSWITCH
RETURN 1
ENDFUNC
FUNC __ARRAYQUICKSORT1D(BYREF $AARRAY, CONST BYREF $ISTART, CONST BYREF $IEND)
IF $IEND <= $ISTART THEN RETURN
LOCAL $VTMP
IF($IEND - $ISTART) < 15 THEN
LOCAL $VCUR
FOR $I = $ISTART + 1 TO $IEND
$VTMP = $AARRAY[$I]
IF ISNUMBER($VTMP) THEN
FOR $J = $I - 1 TO $ISTART STEP -1
$VCUR = $AARRAY[$J]
IF($VTMP >= $VCUR AND ISNUMBER($VCUR)) OR(NOT ISNUMBER($VCUR) AND STRINGCOMPARE($VTMP, $VCUR) >= 0) THEN EXITLOOP
$AARRAY[$J + 1] = $VCUR
NEXT
ELSE
FOR $J = $I - 1 TO $ISTART STEP -1
IF(STRINGCOMPARE($VTMP, $AARRAY[$J]) >= 0) THEN EXITLOOP
$AARRAY[$J + 1] = $AARRAY[$J]
NEXT
ENDIF
$AARRAY[$J + 1] = $VTMP
NEXT
RETURN
ENDIF
LOCAL $L = $ISTART, $R = $IEND, $VPIVOT = $AARRAY[INT(($ISTART + $IEND) / 2)], $BNUM = ISNUMBER($VPIVOT)
DO
IF $BNUM THEN
WHILE($AARRAY[$L] < $VPIVOT AND ISNUMBER($AARRAY[$L])) OR(NOT ISNUMBER($AARRAY[$L]) AND STRINGCOMPARE($AARRAY[$L], $VPIVOT) < 0)
$L += 1
WEND
WHILE($AARRAY[$R] > $VPIVOT AND ISNUMBER($AARRAY[$R])) OR(NOT ISNUMBER($AARRAY[$R]) AND STRINGCOMPARE($AARRAY[$R], $VPIVOT) > 0)
$R -= 1
WEND
ELSE
WHILE(STRINGCOMPARE($AARRAY[$L], $VPIVOT) < 0)
$L += 1
WEND
WHILE(STRINGCOMPARE($AARRAY[$R], $VPIVOT) > 0)
$R -= 1
WEND
ENDIF
IF $L <= $R THEN
$VTMP = $AARRAY[$L]
$AARRAY[$L] = $AARRAY[$R]
$AARRAY[$R] = $VTMP
$L += 1
$R -= 1
ENDIF
UNTIL $L > $R
__ARRAYQUICKSORT1D($AARRAY, $ISTART, $R)
__ARRAYQUICKSORT1D($AARRAY, $L, $IEND)
ENDFUNC
FUNC __ARRAYQUICKSORT2D(BYREF $AARRAY, CONST BYREF $ISTEP, CONST BYREF $ISTART, CONST BYREF $IEND, CONST BYREF $ISUBITEM, CONST BYREF $ISUBMAX)
IF $IEND <= $ISTART THEN RETURN
LOCAL $VTMP, $L = $ISTART, $R = $IEND, $VPIVOT = $AARRAY[INT(($ISTART + $IEND) / 2)][$ISUBITEM], $BNUM = ISNUMBER($VPIVOT)
DO
IF $BNUM THEN
WHILE($ISTEP * ($AARRAY[$L][$ISUBITEM] - $VPIVOT) < 0 AND ISNUMBER($AARRAY[$L][$ISUBITEM])) OR(NOT ISNUMBER($AARRAY[$L][$ISUBITEM]) AND $ISTEP * STRINGCOMPARE($AARRAY[$L][$ISUBITEM], $VPIVOT) < 0)
$L += 1
WEND
WHILE($ISTEP * ($AARRAY[$R][$ISUBITEM] - $VPIVOT) > 0 AND ISNUMBER($AARRAY[$R][$ISUBITEM])) OR(NOT ISNUMBER($AARRAY[$R][$ISUBITEM]) AND $ISTEP * STRINGCOMPARE($AARRAY[$R][$ISUBITEM], $VPIVOT) > 0)
$R -= 1
WEND
ELSE
WHILE($ISTEP * STRINGCOMPARE($AARRAY[$L][$ISUBITEM], $VPIVOT) < 0)
$L += 1
WEND
WHILE($ISTEP * STRINGCOMPARE($AARRAY[$R][$ISUBITEM], $VPIVOT) > 0)
$R -= 1
WEND
ENDIF
IF $L <= $R THEN
FOR $I = 0 TO $ISUBMAX
$VTMP = $AARRAY[$L][$I]
$AARRAY[$L][$I] = $AARRAY[$R][$I]
$AARRAY[$R][$I] = $VTMP
NEXT
$L += 1
$R -= 1
ENDIF
UNTIL $L > $R
__ARRAYQUICKSORT2D($AARRAY, $ISTEP, $ISTART, $R, $ISUBITEM, $ISUBMAX)
__ARRAYQUICKSORT2D($AARRAY, $ISTEP, $L, $IEND, $ISUBITEM, $ISUBMAX)
ENDFUNC
FUNC __ARRAYDUALPIVOTSORT(BYREF $AARRAY, $IPIVOT_LEFT, $IPIVOT_RIGHT, $BLEFTMOST = TRUE)
IF $IPIVOT_LEFT > $IPIVOT_RIGHT THEN RETURN
LOCAL $ILENGTH = $IPIVOT_RIGHT - $IPIVOT_LEFT + 1
LOCAL $I, $J, $K, $IAI, $IAK, $IA1, $IA2, $ILAST
IF $ILENGTH < 45 THEN
IF $BLEFTMOST THEN
$I = $IPIVOT_LEFT
WHILE $I < $IPIVOT_RIGHT
$J = $I
$IAI = $AARRAY[$I + 1]
WHILE $IAI < $AARRAY[$J]
$AARRAY[$J + 1] = $AARRAY[$J]
$J -= 1
IF $J + 1 = $IPIVOT_LEFT THEN EXITLOOP
WEND
$AARRAY[$J + 1] = $IAI
$I += 1
WEND
ELSE
WHILE 1
IF $IPIVOT_LEFT >= $IPIVOT_RIGHT THEN RETURN 1
$IPIVOT_LEFT += 1
IF $AARRAY[$IPIVOT_LEFT] < $AARRAY[$IPIVOT_LEFT - 1] THEN EXITLOOP
WEND
WHILE 1
$K = $IPIVOT_LEFT
$IPIVOT_LEFT += 1
IF $IPIVOT_LEFT > $IPIVOT_RIGHT THEN EXITLOOP
$IA1 = $AARRAY[$K]
$IA2 = $AARRAY[$IPIVOT_LEFT]
IF $IA1 < $IA2 THEN
$IA2 = $IA1
$IA1 = $AARRAY[$IPIVOT_LEFT]
ENDIF
$K -= 1
WHILE $IA1 < $AARRAY[$K]
$AARRAY[$K + 2] = $AARRAY[$K]
$K -= 1
WEND
$AARRAY[$K + 2] = $IA1
WHILE $IA2 < $AARRAY[$K]
$AARRAY[$K + 1] = $AARRAY[$K]
$K -= 1
WEND
$AARRAY[$K + 1] = $IA2
$IPIVOT_LEFT += 1
WEND
$ILAST = $AARRAY[$IPIVOT_RIGHT]
$IPIVOT_RIGHT -= 1
WHILE $ILAST < $AARRAY[$IPIVOT_RIGHT]
$AARRAY[$IPIVOT_RIGHT + 1] = $AARRAY[$IPIVOT_RIGHT]
$IPIVOT_RIGHT -= 1
WEND
$AARRAY[$IPIVOT_RIGHT + 1] = $ILAST
ENDIF
RETURN 1
ENDIF
LOCAL $ISEVENTH = BITSHIFT($ILENGTH, 3) + BITSHIFT($ILENGTH, 6) + 1
LOCAL $IE1, $IE2, $IE3, $IE4, $IE5, $T
$IE3 = CEILING(($IPIVOT_LEFT + $IPIVOT_RIGHT) / 2)
$IE2 = $IE3 - $ISEVENTH
$IE1 = $IE2 - $ISEVENTH
$IE4 = $IE3 + $ISEVENTH
$IE5 = $IE4 + $ISEVENTH
IF $AARRAY[$IE2] < $AARRAY[$IE1] THEN
$T = $AARRAY[$IE2]
$AARRAY[$IE2] = $AARRAY[$IE1]
$AARRAY[$IE1] = $T
ENDIF
IF $AARRAY[$IE3] < $AARRAY[$IE2] THEN
$T = $AARRAY[$IE3]
$AARRAY[$IE3] = $AARRAY[$IE2]
$AARRAY[$IE2] = $T
IF $T < $AARRAY[$IE1] THEN
$AARRAY[$IE2] = $AARRAY[$IE1]
$AARRAY[$IE1] = $T
ENDIF
ENDIF
IF $AARRAY[$IE4] < $AARRAY[$IE3] THEN
$T = $AARRAY[$IE4]
$AARRAY[$IE4] = $AARRAY[$IE3]
$AARRAY[$IE3] = $T
IF $T < $AARRAY[$IE2] THEN
$AARRAY[$IE3] = $AARRAY[$IE2]
$AARRAY[$IE2] = $T
IF $T < $AARRAY[$IE1] THEN
$AARRAY[$IE2] = $AARRAY[$IE1]
$AARRAY[$IE1] = $T
ENDIF
ENDIF
ENDIF
IF $AARRAY[$IE5] < $AARRAY[$IE4] THEN
$T = $AARRAY[$IE5]
$AARRAY[$IE5] = $AARRAY[$IE4]
$AARRAY[$IE4] = $T
IF $T < $AARRAY[$IE3] THEN
$AARRAY[$IE4] = $AARRAY[$IE3]
$AARRAY[$IE3] = $T
IF $T < $AARRAY[$IE2] THEN
$AARRAY[$IE3] = $AARRAY[$IE2]
$AARRAY[$IE2] = $T
IF $T < $AARRAY[$IE1] THEN
$AARRAY[$IE2] = $AARRAY[$IE1]
$AARRAY[$IE1] = $T
ENDIF
ENDIF
ENDIF
ENDIF
LOCAL $ILESS = $IPIVOT_LEFT
LOCAL $IGREATER = $IPIVOT_RIGHT
IF(($AARRAY[$IE1] <> $AARRAY[$IE2]) AND($AARRAY[$IE2] <> $AARRAY[$IE3]) AND($AARRAY[$IE3] <> $AARRAY[$IE4]) AND($AARRAY[$IE4] <> $AARRAY[$IE5])) THEN
LOCAL $IPIVOT_1 = $AARRAY[$IE2]
LOCAL $IPIVOT_2 = $AARRAY[$IE4]
$AARRAY[$IE2] = $AARRAY[$IPIVOT_LEFT]
$AARRAY[$IE4] = $AARRAY[$IPIVOT_RIGHT]
DO
$ILESS += 1
UNTIL $AARRAY[$ILESS] >= $IPIVOT_1
DO
$IGREATER -= 1
UNTIL $AARRAY[$IGREATER] <= $IPIVOT_2
$K = $ILESS
WHILE $K <= $IGREATER
$IAK = $AARRAY[$K]
IF $IAK < $IPIVOT_1 THEN
$AARRAY[$K] = $AARRAY[$ILESS]
$AARRAY[$ILESS] = $IAK
$ILESS += 1
ELSEIF $IAK > $IPIVOT_2 THEN
WHILE $AARRAY[$IGREATER] > $IPIVOT_2
$IGREATER -= 1
IF $IGREATER + 1 = $K THEN EXITLOOP 2
WEND
IF $AARRAY[$IGREATER] < $IPIVOT_1 THEN
$AARRAY[$K] = $AARRAY[$ILESS]
$AARRAY[$ILESS] = $AARRAY[$IGREATER]
$ILESS += 1
ELSE
$AARRAY[$K] = $AARRAY[$IGREATER]
ENDIF
$AARRAY[$IGREATER] = $IAK
$IGREATER -= 1
ENDIF
$K += 1
WEND
$AARRAY[$IPIVOT_LEFT] = $AARRAY[$ILESS - 1]
$AARRAY[$ILESS - 1] = $IPIVOT_1
$AARRAY[$IPIVOT_RIGHT] = $AARRAY[$IGREATER + 1]
$AARRAY[$IGREATER + 1] = $IPIVOT_2
__ARRAYDUALPIVOTSORT($AARRAY, $IPIVOT_LEFT, $ILESS - 2, TRUE)
__ARRAYDUALPIVOTSORT($AARRAY, $IGREATER + 2, $IPIVOT_RIGHT, FALSE)
IF($ILESS < $IE1) AND($IE5 < $IGREATER) THEN
WHILE $AARRAY[$ILESS] = $IPIVOT_1
$ILESS += 1
WEND
WHILE $AARRAY[$IGREATER] = $IPIVOT_2
$IGREATER -= 1
WEND
$K = $ILESS
WHILE $K <= $IGREATER
$IAK = $AARRAY[$K]
IF $IAK = $IPIVOT_1 THEN
$AARRAY[$K] = $AARRAY[$ILESS]
$AARRAY[$ILESS] = $IAK
$ILESS += 1
ELSEIF $IAK = $IPIVOT_2 THEN
WHILE $AARRAY[$IGREATER] = $IPIVOT_2
$IGREATER -= 1
IF $IGREATER + 1 = $K THEN EXITLOOP 2
WEND
IF $AARRAY[$IGREATER] = $IPIVOT_1 THEN
$AARRAY[$K] = $AARRAY[$ILESS]
$AARRAY[$ILESS] = $IPIVOT_1
$ILESS += 1
ELSE
$AARRAY[$K] = $AARRAY[$IGREATER]
ENDIF
$AARRAY[$IGREATER] = $IAK
$IGREATER -= 1
ENDIF
$K += 1
WEND
ENDIF
__ARRAYDUALPIVOTSORT($AARRAY, $ILESS, $IGREATER, FALSE)
ELSE
LOCAL $IPIVOT = $AARRAY[$IE3]
$K = $ILESS
WHILE $K <= $IGREATER
IF $AARRAY[$K] = $IPIVOT THEN
$K += 1
CONTINUELOOP
ENDIF
$IAK = $AARRAY[$K]
IF $IAK < $IPIVOT THEN
$AARRAY[$K] = $AARRAY[$ILESS]
$AARRAY[$ILESS] = $IAK
$ILESS += 1
ELSE
WHILE $AARRAY[$IGREATER] > $IPIVOT
$IGREATER -= 1
WEND
IF $AARRAY[$IGREATER] < $IPIVOT THEN
$AARRAY[$K] = $AARRAY[$ILESS]
$AARRAY[$ILESS] = $AARRAY[$IGREATER]
$ILESS += 1
ELSE
$AARRAY[$K] = $IPIVOT
ENDIF
$AARRAY[$IGREATER] = $IAK
$IGREATER -= 1
ENDIF
$K += 1
WEND
__ARRAYDUALPIVOTSORT($AARRAY, $IPIVOT_LEFT, $ILESS - 1, TRUE)
__ARRAYDUALPIVOTSORT($AARRAY, $IGREATER + 1, $IPIVOT_RIGHT, FALSE)
ENDIF
ENDFUNC
FUNC _ARRAYSWAP(BYREF $AARRAY, $IINDEX_1, $IINDEX_2, $BCOL = FALSE, $ISTART = -1, $IEND = -1)
IF $BCOL = DEFAULT THEN $BCOL = FALSE
IF $ISTART = DEFAULT THEN $ISTART = -1
IF $IEND = DEFAULT THEN $IEND = -1
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
IF $IDIM_2 = -1 THEN
$BCOL = FALSE
$ISTART = -1
$IEND = -1
ENDIF
IF $ISTART > $IEND THEN RETURN SETERROR(5, 0, -1)
IF $BCOL THEN
IF $IINDEX_1 < 0 OR $IINDEX_2 > $IDIM_2 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART = -1 THEN $ISTART = 0
IF $IEND = -1 THEN $IEND = $IDIM_1
ELSE
IF $IINDEX_1 < 0 OR $IINDEX_2 > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART = -1 THEN $ISTART = 0
IF $IEND = -1 THEN $IEND = $IDIM_2
ENDIF
LOCAL $VTMP
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
$VTMP = $AARRAY[$IINDEX_1]
$AARRAY[$IINDEX_1] = $AARRAY[$IINDEX_2]
$AARRAY[$IINDEX_2] = $VTMP
CASE 2
IF $ISTART < -1 OR $IEND < -1 THEN RETURN SETERROR(4, 0, -1)
IF $BCOL THEN
IF $ISTART > $IDIM_1 OR $IEND > $IDIM_1 THEN RETURN SETERROR(4, 0, -1)
FOR $J = $ISTART TO $IEND
$VTMP = $AARRAY[$J][$IINDEX_1]
$AARRAY[$J][$IINDEX_1] = $AARRAY[$J][$IINDEX_2]
$AARRAY[$J][$IINDEX_2] = $VTMP
NEXT
ELSE
IF $ISTART > $IDIM_2 OR $IEND > $IDIM_2 THEN RETURN SETERROR(4, 0, -1)
FOR $J = $ISTART TO $IEND
$VTMP = $AARRAY[$IINDEX_1][$J]
$AARRAY[$IINDEX_1][$J] = $AARRAY[$IINDEX_2][$J]
$AARRAY[$IINDEX_2][$J] = $VTMP
NEXT
ENDIF
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN 1
ENDFUNC
FUNC _ARRAYTOCLIP(CONST BYREF $AARRAY, $SDELIM_COL = "|", $ISTART_ROW = -1, $IEND_ROW = -1, $SDELIM_ROW = @CRLF, $ISTART_COL = -1, $IEND_COL = -1)
LOCAL $SRESULT = _ARRAYTOSTRING($AARRAY, $SDELIM_COL, $ISTART_ROW, $IEND_ROW, $SDELIM_ROW, $ISTART_COL, $IEND_COL)
IF @ERROR THEN RETURN SETERROR(@ERROR, 0, 0)
IF CLIPPUT($SRESULT) THEN RETURN 1
RETURN SETERROR(-1, 0, 0)
ENDFUNC
FUNC _ARRAYTOSTRING(CONST BYREF $AARRAY, $SDELIM_COL = "|", $ISTART_ROW = DEFAULT, $IEND_ROW = DEFAULT, $SDELIM_ROW = @CRLF, $ISTART_COL = DEFAULT, $IEND_COL = DEFAULT)
IF $SDELIM_COL = DEFAULT THEN $SDELIM_COL = "|"
IF $SDELIM_ROW = DEFAULT THEN $SDELIM_ROW = @CRLF
IF $ISTART_ROW = DEFAULT THEN $ISTART_ROW = -1
IF $IEND_ROW = DEFAULT THEN $IEND_ROW = -1
IF $ISTART_COL = DEFAULT THEN $ISTART_COL = -1
IF $IEND_COL = DEFAULT THEN $IEND_COL = -1
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
IF $IDIM_1 = -1 THEN RETURN ""
IF $ISTART_ROW = -1 THEN $ISTART_ROW = 0
IF $IEND_ROW = -1 THEN $IEND_ROW = $IDIM_1
IF $ISTART_ROW < -1 OR $IEND_ROW < -1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART_ROW > $IDIM_1 OR $IEND_ROW > $IDIM_1 THEN RETURN SETERROR(3, 0, "")
IF $ISTART_ROW > $IEND_ROW THEN RETURN SETERROR(4, 0, -1)
LOCAL $SRET = ""
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
FOR $I = $ISTART_ROW TO $IEND_ROW
$SRET &= $AARRAY[$I] & $SDELIM_COL
NEXT
RETURN STRINGTRIMRIGHT($SRET, STRINGLEN($SDELIM_COL))
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
IF $IDIM_2 = -1 THEN RETURN ""
IF $ISTART_COL = -1 THEN $ISTART_COL = 0
IF $IEND_COL = -1 THEN $IEND_COL = $IDIM_2
IF $ISTART_COL < -1 OR $IEND_COL < -1 THEN RETURN SETERROR(5, 0, -1)
IF $ISTART_COL > $IDIM_2 OR $IEND_COL > $IDIM_2 THEN RETURN SETERROR(5, 0, -1)
IF $ISTART_COL > $IEND_COL THEN RETURN SETERROR(6, 0, -1)
LOCAL $IDELIMCOLLEN = STRINGLEN($SDELIM_COL)
FOR $I = $ISTART_ROW TO $IEND_ROW
FOR $J = $ISTART_COL TO $IEND_COL
$SRET &= $AARRAY[$I][$J] & $SDELIM_COL
NEXT
$SRET = STRINGTRIMRIGHT($SRET, $IDELIMCOLLEN) & $SDELIM_ROW
NEXT
RETURN STRINGTRIMRIGHT($SRET, STRINGLEN($SDELIM_ROW))
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN 1
ENDFUNC
FUNC _ARRAYTRANSPOSE(BYREF $AARRAY, $BFORCE1D = FALSE)
LOCAL $ATEMP
SWITCH $BFORCE1D
CASE DEFAULT
$BFORCE1D = FALSE
CASE TRUE, FALSE
CASE ELSE
RETURN SETERROR(3, 0, 0)
ENDSWITCH
SWITCH UBOUND($AARRAY, 0)
CASE 0
RETURN SETERROR(2, 0, 0)
CASE 1
LOCAL $ATEMP[1][UBOUND($AARRAY)]
FOR $I = 0 TO UBOUND($AARRAY) - 1
$ATEMP[0][$I] = $AARRAY[$I]
NEXT
$AARRAY = $ATEMP
CASE 2
LOCAL $IDIM_1 = UBOUND($AARRAY, 1), $IDIM_2 = UBOUND($AARRAY, 2)
IF $IDIM_1 <> $IDIM_2 THEN
LOCAL $ATEMP[$IDIM_2][$IDIM_1]
FOR $I = 0 TO $IDIM_1 - 1
FOR $J = 0 TO $IDIM_2 - 1
$ATEMP[$J][$I] = $AARRAY[$I][$J]
NEXT
NEXT
$AARRAY = $ATEMP
ELSE
LOCAL $VELEMENT
FOR $I = 0 TO $IDIM_1 - 1
FOR $J = $I + 1 TO $IDIM_2 - 1
$VELEMENT = $AARRAY[$I][$J]
$AARRAY[$I][$J] = $AARRAY[$J][$I]
$AARRAY[$J][$I] = $VELEMENT
NEXT
NEXT
ENDIF
IF $BFORCE1D = TRUE AND UBOUND($AARRAY, 2) = 1 THEN
$ATEMP = $AARRAY
REDIM $AARRAY[UBOUND($ATEMP)]
FOR $I = 0 TO UBOUND($ATEMP) - 1
$AARRAY[$I] = $ATEMP[$I][0]
NEXT
ENDIF
CASE ELSE
RETURN SETERROR(1, 0, 0)
ENDSWITCH
RETURN 1
ENDFUNC
FUNC _ARRAYTRIM(BYREF $AARRAY, $ITRIMNUM, $IDIRECTION = 0, $ISTART = 0, $IEND = 0, $ISUBITEM = 0)
IF $IDIRECTION = DEFAULT THEN $IDIRECTION = 0
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $IEND = DEFAULT THEN $IEND = 0
IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, 0)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
IF $IEND = 0 THEN $IEND = $IDIM_1
IF $ISTART > $IEND THEN RETURN SETERROR(3, 0, -1)
IF $ISTART < 0 OR $IEND < 0 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART > $IDIM_1 OR $IEND > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
IF $IDIRECTION THEN
FOR $I = $ISTART TO $IEND
$AARRAY[$I] = STRINGTRIMRIGHT($AARRAY[$I], $ITRIMNUM)
NEXT
ELSE
FOR $I = $ISTART TO $IEND
$AARRAY[$I] = STRINGTRIMLEFT($AARRAY[$I], $ITRIMNUM)
NEXT
ENDIF
CASE 2
LOCAL $IDIM_2 = UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
IF $ISUBITEM < 0 OR $ISUBITEM > $IDIM_2 THEN RETURN SETERROR(5, 0, -1)
IF $IDIRECTION THEN
FOR $I = $ISTART TO $IEND
$AARRAY[$I][$ISUBITEM] = STRINGTRIMRIGHT($AARRAY[$I][$ISUBITEM], $ITRIMNUM)
NEXT
ELSE
FOR $I = $ISTART TO $IEND
$AARRAY[$I][$ISUBITEM] = STRINGTRIMLEFT($AARRAY[$I][$ISUBITEM], $ITRIMNUM)
NEXT
ENDIF
CASE ELSE
RETURN SETERROR(2, 0, 0)
ENDSWITCH
RETURN 1
ENDFUNC
FUNC _ARRAYUNIQUE(CONST BYREF $AARRAY, $ICOLUMN = 0, $IBASE = 0, $ICASE = 0, $ICOUNT = $ARRAYUNIQUE_COUNT, $IINTTYPE = $ARRAYUNIQUE_AUTO)
IF $ICOLUMN = DEFAULT THEN $ICOLUMN = 0
IF $IBASE = DEFAULT THEN $IBASE = 0
IF $ICASE = DEFAULT THEN $ICASE = 0
IF $ICOUNT = DEFAULT THEN $ICOUNT = $ARRAYUNIQUE_COUNT
IF $IINTTYPE = DEFAULT THEN $IINTTYPE = $ARRAYUNIQUE_AUTO
IF UBOUND($AARRAY, $UBOUND_ROWS) = 0 THEN RETURN SETERROR(1, 0, 0)
LOCAL $IDIMS = UBOUND($AARRAY, $UBOUND_DIMENSIONS), $INUMCOLUMNS = UBOUND($AARRAY, $UBOUND_COLUMNS)
IF $IDIMS > 2 THEN RETURN SETERROR(2, 0, 0)
IF $IBASE < 0 OR $IBASE > 1 OR(NOT ISINT($IBASE)) THEN RETURN SETERROR(3, 0, 0)
IF $ICASE < 0 OR $ICASE > 1 OR(NOT ISINT($ICASE)) THEN RETURN SETERROR(3, 0, 0)
IF $ICOUNT < 0 OR $ICOUNT > 1 OR(NOT ISINT($ICOUNT)) THEN RETURN SETERROR(4, 0, 0)
IF $IINTTYPE < 0 OR $IINTTYPE > 4 OR(NOT ISINT($IINTTYPE)) THEN RETURN SETERROR(5, 0, 0)
IF $ICOLUMN < 0 OR($INUMCOLUMNS = 0 AND $ICOLUMN > 0) OR($INUMCOLUMNS > 0 AND $ICOLUMN >= $INUMCOLUMNS) THEN RETURN SETERROR(6, 0, 0)
IF $IINTTYPE = $ARRAYUNIQUE_AUTO THEN
LOCAL $BINT, $SVARTYPE
IF $IDIMS = 1 THEN
$BINT = ISINT($AARRAY[$IBASE])
$SVARTYPE = VARGETTYPE($AARRAY[$IBASE])
ELSE
$BINT = ISINT($AARRAY[$IBASE][$ICOLUMN])
$SVARTYPE = VARGETTYPE($AARRAY[$IBASE][$ICOLUMN])
ENDIF
IF $BINT AND $SVARTYPE = "Int64" THEN
$IINTTYPE = $ARRAYUNIQUE_FORCE64
ELSE
$IINTTYPE = $ARRAYUNIQUE_FORCE32
ENDIF
ENDIF
OBJEVENT("AutoIt.Error", __ARRAYUNIQUE_AUTOERRFUNC)
LOCAL $ODICTIONARY = OBJCREATE("Scripting.Dictionary")
$ODICTIONARY.CompareMode = NUMBER(NOT $ICASE)
LOCAL $VELEM, $STYPE, $VKEY, $BCOMERROR = FALSE
FOR $I = $IBASE TO UBOUND($AARRAY) - 1
IF $IDIMS = 1 THEN
$VELEM = $AARRAY[$I]
ELSE
$VELEM = $AARRAY[$I][$ICOLUMN]
ENDIF
SWITCH $IINTTYPE
CASE $ARRAYUNIQUE_FORCE32
$ODICTIONARY.Item($VELEM)
IF @ERROR THEN
$BCOMERROR = TRUE
EXITLOOP
ENDIF
CASE $ARRAYUNIQUE_FORCE64
$STYPE = VARGETTYPE($VELEM)
IF $STYPE = "Int32" THEN
$BCOMERROR = TRUE
EXITLOOP
ENDIF
$VKEY = "#" & $STYPE & "#" & STRING($VELEM)
IF NOT $ODICTIONARY.Item($VKEY) THEN
$ODICTIONARY($VKEY) = $VELEM
ENDIF
CASE $ARRAYUNIQUE_MATCH
$STYPE = VARGETTYPE($VELEM)
IF STRINGLEFT($STYPE, 3) = "Int" THEN
$VKEY = "#Int#" & STRING($VELEM)
ELSE
$VKEY = "#" & $STYPE & "#" & STRING($VELEM)
ENDIF
IF NOT $ODICTIONARY.Item($VKEY) THEN
$ODICTIONARY($VKEY) = $VELEM
ENDIF
CASE $ARRAYUNIQUE_DISTINCT
$VKEY = "#" & VARGETTYPE($VELEM) & "#" & STRING($VELEM)
IF NOT $ODICTIONARY.Item($VKEY) THEN
$ODICTIONARY($VKEY) = $VELEM
ENDIF
ENDSWITCH
NEXT
LOCAL $AVALUES, $J = 0
IF $BCOMERROR THEN
RETURN SETERROR(7, 0, 0)
ELSEIF $IINTTYPE <> $ARRAYUNIQUE_FORCE32 THEN
LOCAL $AVALUES[$ODICTIONARY.Count]
FOR $VKEY IN $ODICTIONARY.Keys()
$AVALUES[$J] = $ODICTIONARY($VKEY)
IF STRINGLEFT($VKEY, 5) = "#Ptr#" THEN
$AVALUES[$J] = PTR($AVALUES[$J])
ENDIF
$J += 1
NEXT
ELSE
$AVALUES = $ODICTIONARY.Keys()
ENDIF
IF $ICOUNT THEN
_ARRAYINSERT($AVALUES, 0, $ODICTIONARY.Count)
ENDIF
RETURN $AVALUES
ENDFUNC
FUNC _ARRAY1DTOHISTOGRAM($AARRAY, $ISIZING = 100)
IF UBOUND($AARRAY, 0) > 1 THEN RETURN SETERROR(1, 0, "")
$ISIZING = $ISIZING * 8
LOCAL $T, $N, $IMIN = 0, $IMAX = 0, $IOFFSET = 0
FOR $I = 0 TO UBOUND($AARRAY) - 1
$T = $AARRAY[$I]
$T = ISNUMBER($T) ? ROUND($T) : 0
IF $T < $IMIN THEN $IMIN = $T
IF $T > $IMAX THEN $IMAX = $T
NEXT
LOCAL $IRANGE = INT(ROUND(($IMAX - $IMIN) / 8)) * 8
LOCAL $ISPACERATIO = 4
FOR $I = 0 TO UBOUND($AARRAY) - 1
$T = $AARRAY[$I]
IF $T THEN
$N = ABS(ROUND(($ISIZING * $T) / $IRANGE) / 8)
$AARRAY[$I] = ""
IF $T > 0 THEN
IF $IMIN THEN
$IOFFSET = INT(ABS(ROUND(($ISIZING * $IMIN) / $IRANGE) / 8) / 8 * $ISPACERATIO)
$AARRAY[$I] = __ARRAY_STRINGREPEAT(CHRW(32), $IOFFSET)
ENDIF
ELSE
IF $IMIN <> $T THEN
$IOFFSET = INT(ABS(ROUND(($ISIZING * ($T - $IMIN)) / $IRANGE) / 8) / 8 * $ISPACERATIO)
$AARRAY[$I] = __ARRAY_STRINGREPEAT(CHRW(32), $IOFFSET)
ENDIF
ENDIF
$AARRAY[$I] &= __ARRAY_STRINGREPEAT(CHRW(9608), INT($N / 8))
$N = MOD($N, 8)
IF $N > 0 THEN $AARRAY[$I] &= CHRW(9608 + 8 - $N)
$AARRAY[$I] &= " " & $T
ELSE
$AARRAY[$I] = ""
ENDIF
NEXT
RETURN $AARRAY
ENDFUNC
FUNC _ARRAY2DCREATE($AARRAY1, $AARRAY2)
IF NOT ISARRAY($AARRAY1) OR NOT ISARRAY($AARRAY2) THEN RETURN SETERROR(3, 0, "")
LOCAL $IDIM1 = UBOUND($AARRAY1, $UBOUND_DIMENSIONS), $IDIM2 = UBOUND($AARRAY2, $UBOUND_DIMENSIONS)
IF $IDIM1 > 2 OR $IDIM2 > 2 THEN RETURN SETERROR(1, 0, "")
LOCAL $NROWS = UBOUND($AARRAY1, $UBOUND_ROWS)
IF $NROWS <> UBOUND($AARRAY2, $UBOUND_ROWS) THEN RETURN SETERROR(2, 0, "")
LOCAL $NCOLS1 = ($IDIM1 = 1 ? 1 : UBOUND($AARRAY1, $UBOUND_COLUMNS))
LOCAL $NCOLS2 = ($IDIM2 = 1 ? 1 : UBOUND($AARRAY2, $UBOUND_COLUMNS))
LOCAL $ATMP[$NROWS][$NCOLS1 + $NCOLS2]
SELECT
CASE $IDIM1 = 1 AND $IDIM2 = 1
FOR $I = 0 TO $NROWS - 1
$ATMP[$I][0] = $AARRAY1[$I]
$ATMP[$I][1] = $AARRAY2[$I]
NEXT
CASE $IDIM1 = 1 AND $IDIM2 = 2
FOR $I = 0 TO $NROWS - 1
$ATMP[$I][0] = $AARRAY1[$I]
NEXT
FOR $J = 1 TO $NCOLS2
FOR $I = 0 TO $NROWS - 1
$ATMP[$I][$J] = $AARRAY2[$I][$J - 1]
NEXT
NEXT
CASE $IDIM1 = 2 AND $IDIM2 = 1
FOR $J = 0 TO $NCOLS1 - 1
FOR $I = 0 TO $NROWS - 1
$ATMP[$I][$J] = $AARRAY1[$I][$J]
NEXT
NEXT
FOR $I = 0 TO $NROWS - 1
$ATMP[$I][$NCOLS1] = $AARRAY2[$I]
NEXT
CASE $IDIM1 = 2 AND $IDIM2 = 2
FOR $J = 0 TO $NCOLS1 - 1
FOR $I = 0 TO $NROWS - 1
$ATMP[$I][$J] = $AARRAY1[$I][$J]
NEXT
NEXT
FOR $J = $NCOLS1 TO($NCOLS1 + $NCOLS2) - 1
FOR $I = 0 TO $NROWS - 1
$ATMP[$I][$J] = $AARRAY2[$I][$J - $NCOLS1]
NEXT
NEXT
ENDSELECT
RETURN $ATMP
ENDFUNC
FUNC __ARRAY_STRINGREPEAT($SSTRING, $IREPEATCOUNT)
$IREPEATCOUNT = INT($IREPEATCOUNT)
IF STRINGLEN($SSTRING) < 1 OR $IREPEATCOUNT <= 0 THEN RETURN SETERROR(1, 0, "")
LOCAL $SRESULT = ""
WHILE $IREPEATCOUNT > 1
IF BITAND($IREPEATCOUNT, 1) THEN $SRESULT &= $SSTRING
$SSTRING &= $SSTRING
$IREPEATCOUNT = BITSHIFT($IREPEATCOUNT, 1)
WEND
RETURN $SSTRING & $SRESULT
ENDFUNC
FUNC __ARRAY_EXETERINTERNAL(BYREF $AARRAY, $ISTART, $ISIZE, $SDELIMITER, BYREF $AIDX, BYREF $ARESULT, BYREF $ICOUNT)
IF $ISTART == $ISIZE - 1 THEN
FOR $I = 0 TO $ISIZE - 1
$ARESULT[$ICOUNT] &= $AARRAY[$AIDX[$I]] & $SDELIMITER
NEXT
IF $SDELIMITER <> "" THEN $ARESULT[$ICOUNT] = STRINGTRIMRIGHT($ARESULT[$ICOUNT], STRINGLEN($SDELIMITER))
$ICOUNT += 1
ELSE
LOCAL $ITEMP
FOR $I = $ISTART TO $ISIZE - 1
$ITEMP = $AIDX[$I]
$AIDX[$I] = $AIDX[$ISTART]
$AIDX[$ISTART] = $ITEMP
__ARRAY_EXETERINTERNAL($AARRAY, $ISTART + 1, $ISIZE, $SDELIMITER, $AIDX, $ARESULT, $ICOUNT)
$AIDX[$ISTART] = $AIDX[$I]
$AIDX[$I] = $ITEMP
NEXT
ENDIF
ENDFUNC
FUNC __ARRAY_COMBINATIONS($IN, $IR)
LOCAL $I_TOTAL = 1
FOR $I = $IR TO 1 STEP -1
$I_TOTAL *= ($IN / $I)
$IN -= 1
NEXT
RETURN ROUND($I_TOTAL)
ENDFUNC
FUNC __ARRAY_GETNEXT($IN, $IR, BYREF $ILEFT, $ITOTAL, BYREF $AIDX)
IF $ILEFT == $ITOTAL THEN
$ILEFT -= 1
RETURN
ENDIF
LOCAL $I = $IR - 1
WHILE $AIDX[$I] == $IN - $IR + $I
$I -= 1
WEND
$AIDX[$I] += 1
FOR $J = $I + 1 TO $IR - 1
$AIDX[$J] = $AIDX[$I] + $J - $I
NEXT
$ILEFT -= 1
ENDFUNC
FUNC __ARRAY_MINMAXINDEX(CONST BYREF $AARRAY, $ICOMPNUMERIC, $ISTART, $IEND, $ISUBITEM, $FUCOMPARISON)
IF $ICOMPNUMERIC = DEFAULT THEN $ICOMPNUMERIC = 0
IF $ICOMPNUMERIC <> 1 THEN $ICOMPNUMERIC = 0
IF $ISTART = DEFAULT THEN $ISTART = 0
IF $IEND = DEFAULT THEN $IEND = 0
IF $ISUBITEM = DEFAULT THEN $ISUBITEM = 0
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(1, 0, -1)
LOCAL $IDIM_1 = UBOUND($AARRAY, $UBOUND_ROWS) - 1
IF $IDIM_1 < 0 THEN RETURN SETERROR(1, 0, -1)
IF $IEND = -1 THEN $IEND = $IDIM_1
IF $ISTART = -1 THEN $ISTART = 0
IF $ISTART < -1 OR $IEND < -1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART > $IDIM_1 OR $IEND > $IDIM_1 THEN RETURN SETERROR(3, 0, -1)
IF $ISTART > $IEND THEN RETURN SETERROR(4, 0, -1)
IF $IDIM_1 < 0 THEN RETURN SETERROR(5, 0, -1)
LOCAL $IMAXMININDEX = $ISTART
SWITCH UBOUND($AARRAY, $UBOUND_DIMENSIONS)
CASE 1
IF $ICOMPNUMERIC THEN
FOR $I = $ISTART TO $IEND
IF $FUCOMPARISON(NUMBER($AARRAY[$I]), NUMBER($AARRAY[$IMAXMININDEX])) THEN $IMAXMININDEX = $I
NEXT
ELSE
FOR $I = $ISTART TO $IEND
IF $FUCOMPARISON($AARRAY[$I], $AARRAY[$IMAXMININDEX]) THEN $IMAXMININDEX = $I
NEXT
ENDIF
CASE 2
IF $ISUBITEM < 0 OR $ISUBITEM > UBOUND($AARRAY, $UBOUND_COLUMNS) - 1 THEN RETURN SETERROR(6, 0, -1)
IF $ICOMPNUMERIC THEN
FOR $I = $ISTART TO $IEND
IF $FUCOMPARISON(NUMBER($AARRAY[$I][$ISUBITEM]), NUMBER($AARRAY[$IMAXMININDEX][$ISUBITEM])) THEN $IMAXMININDEX = $I
NEXT
ELSE
FOR $I = $ISTART TO $IEND
IF $FUCOMPARISON($AARRAY[$I][$ISUBITEM], $AARRAY[$IMAXMININDEX][$ISUBITEM]) THEN $IMAXMININDEX = $I
NEXT
ENDIF
CASE ELSE
RETURN SETERROR(2, 0, -1)
ENDSWITCH
RETURN $IMAXMININDEX
ENDFUNC
FUNC __ARRAY_GREATERTHAN($VVALUE1, $VVALUE2)
RETURN $VVALUE1 > $VVALUE2
ENDFUNC
FUNC __ARRAY_LESSTHAN($VVALUE1, $VVALUE2)
RETURN $VVALUE1 < $VVALUE2
ENDFUNC
FUNC __ARRAYUNIQUE_AUTOERRFUNC()
ENDFUNC
GLOBAL CONST $FC_NOOVERWRITE = 0
GLOBAL CONST $FC_OVERWRITE = 1
GLOBAL CONST $FC_CREATEPATH = 8
GLOBAL CONST $FT_MODIFIED = 0
GLOBAL CONST $FT_CREATED = 1
GLOBAL CONST $FT_ACCESSED = 2
GLOBAL CONST $FT_ARRAY = 0
GLOBAL CONST $FT_STRING = 1
GLOBAL CONST $FT_MSEC = 2
GLOBAL CONST $FT_UTC = 4
GLOBAL CONST $FSF_CREATEBUTTON = 1
GLOBAL CONST $FSF_NEWDIALOG = 2
GLOBAL CONST $FSF_EDITCONTROL = 4
GLOBAL CONST $FT_NONRECURSIVE = 0
GLOBAL CONST $FT_RECURSIVE = 1
GLOBAL CONST $FO_READ = 0
GLOBAL CONST $FO_APPEND = 1
GLOBAL CONST $FO_OVERWRITE = 2
GLOBAL CONST $FO_CREATEPATH = 8
GLOBAL CONST $FO_BINARY = 16
GLOBAL CONST $FO_UNICODE = 32
GLOBAL CONST $FO_UTF16_LE = 32
GLOBAL CONST $FO_UTF16_BE = 64
GLOBAL CONST $FO_UTF8 = 128
GLOBAL CONST $FO_UTF8_NOBOM = 256
GLOBAL CONST $FO_ANSI = 512
GLOBAL CONST $FO_UTF16_LE_NOBOM = 1024
GLOBAL CONST $FO_UTF16_BE_NOBOM = 2048
GLOBAL CONST $FO_UTF8_FULL = 16384
GLOBAL CONST $FO_FULLFILE_DETECT = 16384
GLOBAL CONST $EOF = -1
GLOBAL CONST $FD_FILEMUSTEXIST = 1
GLOBAL CONST $FD_PATHMUSTEXIST = 2
GLOBAL CONST $FD_MULTISELECT = 4
GLOBAL CONST $FD_PROMPTCREATENEW = 8
GLOBAL CONST $FD_PROMPTOVERWRITE = 16
GLOBAL CONST $CREATE_NEW = 1
GLOBAL CONST $CREATE_ALWAYS = 2
GLOBAL CONST $OPEN_EXISTING = 3
GLOBAL CONST $OPEN_ALWAYS = 4
GLOBAL CONST $TRUNCATE_EXISTING = 5
GLOBAL CONST $INVALID_SET_FILE_POINTER = -1
GLOBAL CONST $FILE_BEGIN = 0
GLOBAL CONST $FILE_CURRENT = 1
GLOBAL CONST $FILE_END = 2
GLOBAL CONST $FILE_ATTRIBUTE_READONLY = 1
GLOBAL CONST $FILE_ATTRIBUTE_HIDDEN = 2
GLOBAL CONST $FILE_ATTRIBUTE_SYSTEM = 4
GLOBAL CONST $FILE_ATTRIBUTE_DIRECTORY = 16
GLOBAL CONST $FILE_ATTRIBUTE_ARCHIVE = 32
GLOBAL CONST $FILE_ATTRIBUTE_DEVICE = 64
GLOBAL CONST $FILE_ATTRIBUTE_NORMAL = 128
GLOBAL CONST $FILE_ATTRIBUTE_TEMPORARY = 256
GLOBAL CONST $FILE_ATTRIBUTE_SPARSE_FILE = 512
GLOBAL CONST $FILE_ATTRIBUTE_REPARSE_POINT = 1024
GLOBAL CONST $FILE_ATTRIBUTE_COMPRESSED = 2048
GLOBAL CONST $FILE_ATTRIBUTE_OFFLINE = 4096
GLOBAL CONST $FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192
GLOBAL CONST $FILE_ATTRIBUTE_ENCRYPTED = 16384
GLOBAL CONST $FILE_SHARE_READ = 1
GLOBAL CONST $FILE_SHARE_WRITE = 2
GLOBAL CONST $FILE_SHARE_DELETE = 4
GLOBAL CONST $FILE_SHARE_READWRITE = BITOR($FILE_SHARE_READ, $FILE_SHARE_WRITE)
GLOBAL CONST $FILE_SHARE_ANY = BITOR($FILE_SHARE_READ, $FILE_SHARE_WRITE, $FILE_SHARE_DELETE)
GLOBAL CONST $GENERIC_ALL = 268435456
GLOBAL CONST $GENERIC_EXECUTE = 536870912
GLOBAL CONST $GENERIC_WRITE = 1073741824
GLOBAL CONST $GENERIC_READ = -2147483648
GLOBAL CONST $GENERIC_READWRITE = BITOR($GENERIC_READ, $GENERIC_WRITE)
GLOBAL CONST $FILE_ENCODING_UTF16LE = 32
GLOBAL CONST $FE_ENTIRE_UTF8 = 1
GLOBAL CONST $FE_PARTIALFIRST_UTF8 = 2
GLOBAL CONST $FN_FULLPATH = 0
GLOBAL CONST $FN_RELATIVEPATH = 1
GLOBAL CONST $FV_COMMENTS = "Comments"
GLOBAL CONST $FV_COMPANYNAME = "CompanyName"
GLOBAL CONST $FV_FILEDESCRIPTION = "FileDescription"
GLOBAL CONST $FV_FILEVERSION = "FileVersion"
GLOBAL CONST $FV_INTERNALNAME = "InternalName"
GLOBAL CONST $FV_LEGALCOPYRIGHT = "LegalCopyright"
GLOBAL CONST $FV_LEGALTRADEMARKS = "LegalTrademarks"
GLOBAL CONST $FV_ORIGINALFILENAME = "OriginalFilename"
GLOBAL CONST $FV_PRODUCTNAME = "ProductName"
GLOBAL CONST $FV_PRODUCTVERSION = "ProductVersion"
GLOBAL CONST $FV_PRIVATEBUILD = "PrivateBuild"
GLOBAL CONST $FV_SPECIALBUILD = "SpecialBuild"
GLOBAL CONST $FRTA_NOCOUNT = 0
GLOBAL CONST $FRTA_COUNT = 1
GLOBAL CONST $FRTA_INTARRAYS = 2
GLOBAL CONST $FRTA_ENTIRESPLIT = 4
GLOBAL CONST $FLTA_FILESFOLDERS = 0
GLOBAL CONST $FLTA_FILES = 1
GLOBAL CONST $FLTA_FOLDERS = 2
GLOBAL CONST $FLTAR_FILESFOLDERS = 0
GLOBAL CONST $FLTAR_FILES = 1
GLOBAL CONST $FLTAR_FOLDERS = 2
GLOBAL CONST $FLTAR_NOHIDDEN = 4
GLOBAL CONST $FLTAR_NOSYSTEM = 8
GLOBAL CONST $FLTAR_NOLINK = 16
GLOBAL CONST $FLTAR_NORECUR = 0
GLOBAL CONST $FLTAR_RECUR = 1
GLOBAL CONST $FLTAR_NOSORT = 0
GLOBAL CONST $FLTAR_SORT = 1
GLOBAL CONST $FLTAR_FASTSORT = 2
GLOBAL CONST $FLTAR_NOPATH = 0
GLOBAL CONST $FLTAR_RELPATH = 1
GLOBAL CONST $FLTAR_FULLPATH = 2
GLOBAL CONST $PATH_ORIGINAL = 0
GLOBAL CONST $PATH_DRIVE = 1
GLOBAL CONST $PATH_DIRECTORY = 2
GLOBAL CONST $PATH_FILENAME = 3
GLOBAL CONST $PATH_EXTENSION = 4
FUNC _FILECOUNTLINES($SFILEPATH)
FILEREADTOARRAY($SFILEPATH)
IF @ERROR THEN RETURN SETERROR(@ERROR, @EXTENDED, 0)
RETURN @EXTENDED
ENDFUNC
FUNC _FILECREATE($SFILEPATH)
LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, BITOR($FO_OVERWRITE, $FO_CREATEPATH))
IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, 0)
LOCAL $IFILEWRITE = FILEWRITE($HFILEOPEN, "")
FILECLOSE($HFILEOPEN)
IF NOT $IFILEWRITE THEN RETURN SETERROR(2, 0, 0)
RETURN 1
ENDFUNC
FUNC _FILELISTTOARRAY($SFILEPATH, $SFILTER = "*", $IFLAG = $FLTA_FILESFOLDERS, $BRETURNPATH = FALSE)
LOCAL $SDELIMITER = "|", $SFILELIST = "", $SFILENAME = "", $SFULLPATH = ""
$SFILEPATH = STRINGREGEXPREPLACE($SFILEPATH, "[\\/]+$", "") & "\"
IF $IFLAG = DEFAULT THEN $IFLAG = $FLTA_FILESFOLDERS
IF $BRETURNPATH THEN $SFULLPATH = $SFILEPATH
IF $SFILTER = DEFAULT THEN $SFILTER = "*"
IF NOT FILEEXISTS($SFILEPATH) THEN RETURN SETERROR(1, 0, 0)
IF STRINGREGEXP($SFILTER, "[\\/:><\|]|(?s)^\s*$") THEN RETURN SETERROR(2, 0, 0)
IF NOT($IFLAG = 0 OR $IFLAG = 1 OR $IFLAG = 2) THEN RETURN SETERROR(3, 0, 0)
LOCAL $HSEARCH = FILEFINDFIRSTFILE($SFILEPATH & $SFILTER)
IF @ERROR THEN RETURN SETERROR(4, 0, 0)
WHILE 1
$SFILENAME = FILEFINDNEXTFILE($HSEARCH)
IF @ERROR THEN EXITLOOP
IF($IFLAG + @EXTENDED = 2) THEN CONTINUELOOP
$SFILELIST &= $SDELIMITER & $SFULLPATH & $SFILENAME
WEND
FILECLOSE($HSEARCH)
IF $SFILELIST = "" THEN RETURN SETERROR(4, 0, 0)
RETURN STRINGSPLIT(STRINGTRIMLEFT($SFILELIST, 1), $SDELIMITER)
ENDFUNC
FUNC _FILELISTTOARRAYREC($SFILEPATH, $SMASK = "*", $IRETURN = $FLTAR_FILESFOLDERS, $IRECUR = $FLTAR_NORECUR, $ISORT = $FLTAR_NOSORT, $IRETURNPATH = $FLTAR_RELPATH)
IF NOT FILEEXISTS($SFILEPATH) THEN RETURN SETERROR(1, 1, "")
IF $SMASK = DEFAULT THEN $SMASK = "*"
IF $IRETURN = DEFAULT THEN $IRETURN = $FLTAR_FILESFOLDERS
IF $IRECUR = DEFAULT THEN $IRECUR = $FLTAR_NORECUR
IF $ISORT = DEFAULT THEN $ISORT = $FLTAR_NOSORT
IF $IRETURNPATH = DEFAULT THEN $IRETURNPATH = $FLTAR_RELPATH
IF $IRECUR > 1 OR NOT ISINT($IRECUR) THEN RETURN SETERROR(1, 6, "")
LOCAL $BLONGPATH = FALSE
IF STRINGLEFT($SFILEPATH, 4) == "\\?\" THEN
$BLONGPATH = TRUE
ENDIF
LOCAL $SFOLDERSLASH = ""
IF STRINGRIGHT($SFILEPATH, 1) = "\" THEN
$SFOLDERSLASH = "\"
ELSE
$SFILEPATH = $SFILEPATH & "\"
ENDIF
LOCAL $ASFOLDERSEARCHLIST[100] = [1]
$ASFOLDERSEARCHLIST[1] = $SFILEPATH
LOCAL $IHIDE_HS = 0, $SHIDE_HS = ""
IF BITAND($IRETURN, $FLTAR_NOHIDDEN) THEN
$IHIDE_HS += 2
$SHIDE_HS &= "H"
$IRETURN -= $FLTAR_NOHIDDEN
ENDIF
IF BITAND($IRETURN, $FLTAR_NOSYSTEM) THEN
$IHIDE_HS += 4
$SHIDE_HS &= "S"
$IRETURN -= $FLTAR_NOSYSTEM
ENDIF
LOCAL $IHIDE_LINK = 0
IF BITAND($IRETURN, $FLTAR_NOLINK) THEN
$IHIDE_LINK = 1024
$IRETURN -= $FLTAR_NOLINK
ENDIF
LOCAL $IMAXLEVEL = 0
IF $IRECUR < 0 THEN
STRINGREPLACE($SFILEPATH, "\", "", 0, $STR_NOCASESENSEBASIC)
$IMAXLEVEL = @EXTENDED - $IRECUR
ENDIF
LOCAL $SEXCLUDE_LIST = "", $SEXCLUDE_LIST_FOLDER = "", $SINCLUDE_LIST = "*"
LOCAL $AMASKSPLIT = STRINGSPLIT($SMASK, "|")
SWITCH $AMASKSPLIT[0]
CASE 3
$SEXCLUDE_LIST_FOLDER = $AMASKSPLIT[3]
CONTINUECASE
CASE 2
$SEXCLUDE_LIST = $AMASKSPLIT[2]
CONTINUECASE
CASE 1
$SINCLUDE_LIST = $AMASKSPLIT[1]
ENDSWITCH
LOCAL $SINCLUDE_FILE_MASK = ".+"
IF $SINCLUDE_LIST <> "*" THEN
IF NOT __FLTAR_LISTTOMASK($SINCLUDE_FILE_MASK, $SINCLUDE_LIST) THEN RETURN SETERROR(1, 2, "")
ENDIF
LOCAL $SINCLUDE_FOLDER_MASK = ".+"
SWITCH $IRETURN
CASE 0
SWITCH $IRECUR
CASE 0
$SINCLUDE_FOLDER_MASK = $SINCLUDE_FILE_MASK
ENDSWITCH
CASE 2
$SINCLUDE_FOLDER_MASK = $SINCLUDE_FILE_MASK
ENDSWITCH
LOCAL $SEXCLUDE_FILE_MASK = ":"
IF $SEXCLUDE_LIST <> "" THEN
IF NOT __FLTAR_LISTTOMASK($SEXCLUDE_FILE_MASK, $SEXCLUDE_LIST) THEN RETURN SETERROR(1, 3, "")
ENDIF
LOCAL $SEXCLUDE_FOLDER_MASK = ":"
IF $IRECUR THEN
IF $SEXCLUDE_LIST_FOLDER THEN
IF NOT __FLTAR_LISTTOMASK($SEXCLUDE_FOLDER_MASK, $SEXCLUDE_LIST_FOLDER) THEN RETURN SETERROR(1, 4, "")
ENDIF
IF $IRETURN = 2 THEN
$SEXCLUDE_FOLDER_MASK = $SEXCLUDE_FILE_MASK
ENDIF
ELSE
$SEXCLUDE_FOLDER_MASK = $SEXCLUDE_FILE_MASK
ENDIF
IF NOT($IRETURN = 0 OR $IRETURN = 1 OR $IRETURN = 2) THEN RETURN SETERROR(1, 5, "")
IF NOT($ISORT = 0 OR $ISORT = 1 OR $ISORT = 2) THEN RETURN SETERROR(1, 7, "")
IF NOT($IRETURNPATH = 0 OR $IRETURNPATH = 1 OR $IRETURNPATH = 2) THEN RETURN SETERROR(1, 8, "")
IF $IHIDE_LINK THEN
LOCAL $TFILE_DATA = DLLSTRUCTCREATE("struct;align 4;dword FileAttributes;uint64 CreationTime;uint64 LastAccessTime;uint64 LastWriteTime;" & "dword FileSizeHigh;dword FileSizeLow;dword Reserved0;dword Reserved1;wchar FileName[260];wchar AlternateFileName[14];endstruct")
LOCAL $HDLL = DLLOPEN("kernel32.dll"), $ADLL_RET
ENDIF
LOCAL $ASRETURNLIST[100] = [0]
LOCAL $ASFILEMATCHLIST = $ASRETURNLIST, $ASROOTFILEMATCHLIST = $ASRETURNLIST, $ASFOLDERMATCHLIST = $ASRETURNLIST
LOCAL $BFOLDER = FALSE, $HSEARCH = 0, $SCURRENTPATH = "", $SNAME = "", $SRETPATH = ""
LOCAL $IATTRIBS = 0, $SATTRIBS = ""
LOCAL $ASFOLDERFILESECTIONLIST[100][2] = [[0, 0]]
WHILE $ASFOLDERSEARCHLIST[0] > 0
$SCURRENTPATH = $ASFOLDERSEARCHLIST[$ASFOLDERSEARCHLIST[0]]
$ASFOLDERSEARCHLIST[0] -= 1
SWITCH $IRETURNPATH
CASE 1
$SRETPATH = STRINGREPLACE($SCURRENTPATH, $SFILEPATH, "")
CASE 2
IF $BLONGPATH THEN
$SRETPATH = STRINGTRIMLEFT($SCURRENTPATH, 4)
ELSE
$SRETPATH = $SCURRENTPATH
ENDIF
ENDSWITCH
IF $IHIDE_LINK THEN
$ADLL_RET = DLLCALL($HDLL, "handle", "FindFirstFileW", "wstr", $SCURRENTPATH & "*", "struct*", $TFILE_DATA)
IF @ERROR OR NOT $ADLL_RET[0] THEN
CONTINUELOOP
ENDIF
$HSEARCH = $ADLL_RET[0]
ELSE
$HSEARCH = FILEFINDFIRSTFILE($SCURRENTPATH & "*")
IF $HSEARCH = -1 THEN
CONTINUELOOP
ENDIF
ENDIF
IF $IRETURN = 0 AND $ISORT AND $IRETURNPATH THEN
__FLTAR_ADDTOLIST($ASFOLDERFILESECTIONLIST, $SRETPATH, $ASFILEMATCHLIST[0] + 1)
ENDIF
$SATTRIBS = ""
WHILE 1
IF $IHIDE_LINK THEN
$ADLL_RET = DLLCALL($HDLL, "int", "FindNextFileW", "handle", $HSEARCH, "struct*", $TFILE_DATA)
IF @ERROR OR NOT $ADLL_RET[0] THEN
EXITLOOP
ENDIF
$SNAME = DLLSTRUCTGETDATA($TFILE_DATA, "FileName")
IF $SNAME = ".." OR $SNAME = "." THEN
CONTINUELOOP
ENDIF
$IATTRIBS = DLLSTRUCTGETDATA($TFILE_DATA, "FileAttributes")
IF $IHIDE_HS AND BITAND($IATTRIBS, $IHIDE_HS) THEN
CONTINUELOOP
ENDIF
IF BITAND($IATTRIBS, $IHIDE_LINK) THEN
CONTINUELOOP
ENDIF
$BFOLDER = FALSE
IF BITAND($IATTRIBS, 16) THEN
$BFOLDER = TRUE
ENDIF
ELSE
$BFOLDER = FALSE
$SNAME = FILEFINDNEXTFILE($HSEARCH, 1)
IF @ERROR THEN
EXITLOOP
ENDIF
IF $SNAME = ".." OR $SNAME = "." THEN
CONTINUELOOP
ENDIF
$SATTRIBS = @EXTENDED
IF STRINGINSTR($SATTRIBS, "D") THEN
$BFOLDER = TRUE
ENDIF
IF STRINGREGEXP($SATTRIBS, "[" & $SHIDE_HS & "]") THEN
CONTINUELOOP
ENDIF
ENDIF
IF $BFOLDER THEN
SELECT
CASE $IRECUR < 0
STRINGREPLACE($SCURRENTPATH, "\", "", 0, $STR_NOCASESENSEBASIC)
IF @EXTENDED < $IMAXLEVEL THEN
CONTINUECASE
ENDIF
CASE $IRECUR = 1
IF NOT STRINGREGEXP($SNAME, $SEXCLUDE_FOLDER_MASK) THEN
__FLTAR_ADDTOLIST($ASFOLDERSEARCHLIST, $SCURRENTPATH & $SNAME & "\")
ENDIF
ENDSELECT
ENDIF
IF $ISORT THEN
IF $BFOLDER THEN
IF STRINGREGEXP($SNAME, $SINCLUDE_FOLDER_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FOLDER_MASK) THEN
__FLTAR_ADDTOLIST($ASFOLDERMATCHLIST, $SRETPATH & $SNAME & $SFOLDERSLASH)
ENDIF
ELSE
IF STRINGREGEXP($SNAME, $SINCLUDE_FILE_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FILE_MASK) THEN
IF $SCURRENTPATH = $SFILEPATH THEN
__FLTAR_ADDTOLIST($ASROOTFILEMATCHLIST, $SRETPATH & $SNAME)
ELSE
__FLTAR_ADDTOLIST($ASFILEMATCHLIST, $SRETPATH & $SNAME)
ENDIF
ENDIF
ENDIF
ELSE
IF $BFOLDER THEN
IF $IRETURN <> 1 AND STRINGREGEXP($SNAME, $SINCLUDE_FOLDER_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FOLDER_MASK) THEN
__FLTAR_ADDTOLIST($ASRETURNLIST, $SRETPATH & $SNAME & $SFOLDERSLASH)
ENDIF
ELSE
IF $IRETURN <> 2 AND STRINGREGEXP($SNAME, $SINCLUDE_FILE_MASK) AND NOT STRINGREGEXP($SNAME, $SEXCLUDE_FILE_MASK) THEN
__FLTAR_ADDTOLIST($ASRETURNLIST, $SRETPATH & $SNAME)
ENDIF
ENDIF
ENDIF
WEND
IF $IHIDE_LINK THEN
DLLCALL($HDLL, "int", "FindClose", "ptr", $HSEARCH)
ELSE
FILECLOSE($HSEARCH)
ENDIF
WEND
IF $IHIDE_LINK THEN
DLLCLOSE($HDLL)
ENDIF
IF $ISORT THEN
SWITCH $IRETURN
CASE 2
IF $ASFOLDERMATCHLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
REDIM $ASFOLDERMATCHLIST[$ASFOLDERMATCHLIST[0] + 1]
$ASRETURNLIST = $ASFOLDERMATCHLIST
__ARRAYDUALPIVOTSORT($ASRETURNLIST, 1, $ASRETURNLIST[0])
CASE 1
IF $ASROOTFILEMATCHLIST[0] = 0 AND $ASFILEMATCHLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
IF $IRETURNPATH = 0 THEN
__FLTAR_ADDFILELISTS($ASRETURNLIST, $ASROOTFILEMATCHLIST, $ASFILEMATCHLIST)
__ARRAYDUALPIVOTSORT($ASRETURNLIST, 1, $ASRETURNLIST[0])
ELSE
__FLTAR_ADDFILELISTS($ASRETURNLIST, $ASROOTFILEMATCHLIST, $ASFILEMATCHLIST, 1)
ENDIF
CASE 0
IF $ASROOTFILEMATCHLIST[0] = 0 AND $ASFOLDERMATCHLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
IF $IRETURNPATH = 0 THEN
__FLTAR_ADDFILELISTS($ASRETURNLIST, $ASROOTFILEMATCHLIST, $ASFILEMATCHLIST)
$ASRETURNLIST[0] += $ASFOLDERMATCHLIST[0]
REDIM $ASFOLDERMATCHLIST[$ASFOLDERMATCHLIST[0] + 1]
_ARRAYCONCATENATE($ASRETURNLIST, $ASFOLDERMATCHLIST, 1)
__ARRAYDUALPIVOTSORT($ASRETURNLIST, 1, $ASRETURNLIST[0])
ELSE
LOCAL $ASRETURNLIST[$ASFILEMATCHLIST[0] + $ASROOTFILEMATCHLIST[0] + $ASFOLDERMATCHLIST[0] + 1]
$ASRETURNLIST[0] = $ASFILEMATCHLIST[0] + $ASROOTFILEMATCHLIST[0] + $ASFOLDERMATCHLIST[0]
__ARRAYDUALPIVOTSORT($ASROOTFILEMATCHLIST, 1, $ASROOTFILEMATCHLIST[0])
FOR $I = 1 TO $ASROOTFILEMATCHLIST[0]
$ASRETURNLIST[$I] = $ASROOTFILEMATCHLIST[$I]
NEXT
LOCAL $INEXTINSERTIONINDEX = $ASROOTFILEMATCHLIST[0] + 1
__ARRAYDUALPIVOTSORT($ASFOLDERMATCHLIST, 1, $ASFOLDERMATCHLIST[0])
LOCAL $SFOLDERTOFIND = ""
FOR $I = 1 TO $ASFOLDERMATCHLIST[0]
$ASRETURNLIST[$INEXTINSERTIONINDEX] = $ASFOLDERMATCHLIST[$I]
$INEXTINSERTIONINDEX += 1
IF $SFOLDERSLASH THEN
$SFOLDERTOFIND = $ASFOLDERMATCHLIST[$I]
ELSE
$SFOLDERTOFIND = $ASFOLDERMATCHLIST[$I] & "\"
ENDIF
LOCAL $IFILESECTIONENDINDEX = 0, $IFILESECTIONSTARTINDEX = 0
FOR $J = 1 TO $ASFOLDERFILESECTIONLIST[0][0]
IF $SFOLDERTOFIND = $ASFOLDERFILESECTIONLIST[$J][0] THEN
$IFILESECTIONSTARTINDEX = $ASFOLDERFILESECTIONLIST[$J][1]
IF $J = $ASFOLDERFILESECTIONLIST[0][0] THEN
$IFILESECTIONENDINDEX = $ASFILEMATCHLIST[0]
ELSE
$IFILESECTIONENDINDEX = $ASFOLDERFILESECTIONLIST[$J + 1][1] - 1
ENDIF
IF $ISORT = 1 THEN
__ARRAYDUALPIVOTSORT($ASFILEMATCHLIST, $IFILESECTIONSTARTINDEX, $IFILESECTIONENDINDEX)
ENDIF
FOR $K = $IFILESECTIONSTARTINDEX TO $IFILESECTIONENDINDEX
$ASRETURNLIST[$INEXTINSERTIONINDEX] = $ASFILEMATCHLIST[$K]
$INEXTINSERTIONINDEX += 1
NEXT
EXITLOOP
ENDIF
NEXT
NEXT
ENDIF
ENDSWITCH
ELSE
IF $ASRETURNLIST[0] = 0 THEN RETURN SETERROR(1, 9, "")
REDIM $ASRETURNLIST[$ASRETURNLIST[0] + 1]
ENDIF
RETURN $ASRETURNLIST
ENDFUNC
FUNC __FLTAR_ADDFILELISTS(BYREF $ASTARGET, $ASSOURCE_1, $ASSOURCE_2, $ISORT = 0)
REDIM $ASSOURCE_1[$ASSOURCE_1[0] + 1]
IF $ISORT = 1 THEN __ARRAYDUALPIVOTSORT($ASSOURCE_1, 1, $ASSOURCE_1[0])
$ASTARGET = $ASSOURCE_1
$ASTARGET[0] += $ASSOURCE_2[0]
REDIM $ASSOURCE_2[$ASSOURCE_2[0] + 1]
IF $ISORT = 1 THEN __ARRAYDUALPIVOTSORT($ASSOURCE_2, 1, $ASSOURCE_2[0])
_ARRAYCONCATENATE($ASTARGET, $ASSOURCE_2, 1)
ENDFUNC
FUNC __FLTAR_ADDTOLIST(BYREF $ALIST, $VVALUE_0, $VVALUE_1 = -1)
IF $VVALUE_1 = -1 THEN
$ALIST[0] += 1
IF UBOUND($ALIST) <= $ALIST[0] THEN REDIM $ALIST[UBOUND($ALIST) * 2]
$ALIST[$ALIST[0]] = $VVALUE_0
ELSE
$ALIST[0][0] += 1
IF UBOUND($ALIST) <= $ALIST[0][0] THEN REDIM $ALIST[UBOUND($ALIST) * 2][2]
$ALIST[$ALIST[0][0]][0] = $VVALUE_0
$ALIST[$ALIST[0][0]][1] = $VVALUE_1
ENDIF
ENDFUNC
FUNC __FLTAR_LISTTOMASK(BYREF $SMASK, $SLIST)
IF STRINGREGEXP($SLIST, "\\|/|:|\<|\>|\|") THEN RETURN 0
$SLIST = STRINGREPLACE(STRINGSTRIPWS(STRINGREGEXPREPLACE($SLIST, "\s*;\s*", ";"), BITOR($STR_STRIPLEADING, $STR_STRIPTRAILING)), ";", "|")
$SLIST = STRINGREPLACE(STRINGREPLACE(STRINGREGEXPREPLACE($SLIST, "[][$^.{}()+\-]", "\\$0"), "?", "."), "*", ".*?")
$SMASK = "(?i)^(" & $SLIST & ")\z"
RETURN 1
ENDFUNC
FUNC _FILEPRINT($SFILEPATH, $ISHOW = @SW_HIDE)
RETURN SHELLEXECUTE($SFILEPATH, "", @WORKINGDIR, "print", $ISHOW = DEFAULT ? @SW_HIDE : $ISHOW)
ENDFUNC
FUNC _FILEREADTOARRAY($SFILEPATH, BYREF $VRETURN, $IFLAGS = $FRTA_COUNT, $SDELIMITER = "")
$VRETURN = 0
IF $IFLAGS = DEFAULT THEN $IFLAGS = $FRTA_COUNT
IF $SDELIMITER = DEFAULT THEN $SDELIMITER = ""
LOCAL $BEXPAND = TRUE
IF BITAND($IFLAGS, $FRTA_INTARRAYS) THEN
$BEXPAND = FALSE
$IFLAGS -= $FRTA_INTARRAYS
ENDIF
LOCAL $IENTIRE = $STR_CHRSPLIT
IF BITAND($IFLAGS, $FRTA_ENTIRESPLIT) THEN
$IENTIRE = $STR_ENTIRESPLIT
$IFLAGS -= $FRTA_ENTIRESPLIT
ENDIF
LOCAL $INOCOUNT = 0
IF $IFLAGS <> $FRTA_COUNT THEN
$IFLAGS = $FRTA_NOCOUNT
$INOCOUNT = $STR_NOCOUNT
ENDIF
IF $SDELIMITER THEN
LOCAL $ALINES = FILEREADTOARRAY($SFILEPATH)
IF @ERROR THEN RETURN SETERROR(@ERROR, 0, 0)
LOCAL $IDIM_1 = UBOUND($ALINES) + $IFLAGS
IF $BEXPAND THEN
LOCAL $IDIM_2 = UBOUND(STRINGSPLIT($ALINES[0], $SDELIMITER, $IENTIRE + $STR_NOCOUNT))
LOCAL $ATEMP_ARRAY[$IDIM_1][$IDIM_2]
LOCAL $IFIELDS, $ASPLIT
FOR $I = 0 TO $IDIM_1 - $IFLAGS - 1
$ASPLIT = STRINGSPLIT($ALINES[$I], $SDELIMITER, $IENTIRE + $STR_NOCOUNT)
$IFIELDS = UBOUND($ASPLIT)
IF $IFIELDS <> $IDIM_2 THEN
RETURN SETERROR(3, 0, 0)
ENDIF
FOR $J = 0 TO $IFIELDS - 1
$ATEMP_ARRAY[$I + $IFLAGS][$J] = $ASPLIT[$J]
NEXT
NEXT
IF $IDIM_2 < 2 THEN RETURN SETERROR(4, 0, 0)
IF $IFLAGS THEN
$ATEMP_ARRAY[0][0] = $IDIM_1 - $IFLAGS
$ATEMP_ARRAY[0][1] = $IDIM_2
ENDIF
ELSE
LOCAL $ATEMP_ARRAY[$IDIM_1]
FOR $I = 0 TO $IDIM_1 - $IFLAGS - 1
$ATEMP_ARRAY[$I + $IFLAGS] = STRINGSPLIT($ALINES[$I], $SDELIMITER, $IENTIRE + $INOCOUNT)
NEXT
IF $IFLAGS THEN
$ATEMP_ARRAY[0] = $IDIM_1 - $IFLAGS
ENDIF
ENDIF
$VRETURN = $ATEMP_ARRAY
ELSE
IF $IFLAGS THEN
LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, $FO_READ)
IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, 0)
LOCAL $SFILEREAD = FILEREAD($HFILEOPEN)
FILECLOSE($HFILEOPEN)
IF STRINGLEN($SFILEREAD) THEN
$VRETURN = STRINGREGEXP(@LF & $SFILEREAD, "(?|(\N+)\z|(\N*)(?:\R))", $STR_REGEXPARRAYGLOBALMATCH)
$VRETURN[0] = UBOUND($VRETURN) - 1
ELSE
RETURN SETERROR(2, 0, 0)
ENDIF
ELSE
$VRETURN = FILEREADTOARRAY($SFILEPATH)
IF @ERROR THEN
$VRETURN = 0
RETURN SETERROR(@ERROR, 0, 0)
ENDIF
ENDIF
ENDIF
RETURN 1
ENDFUNC
FUNC _FILEWRITEFROMARRAY($SFILEPATH, CONST BYREF $AARRAY, $IBASE = DEFAULT, $IUBOUND = DEFAULT, $SDELIMITER = "|")
LOCAL $IRETURN = 0
IF NOT ISARRAY($AARRAY) THEN RETURN SETERROR(2, 0, $IRETURN)
LOCAL $IDIMS = UBOUND($AARRAY, $UBOUND_DIMENSIONS)
IF $IDIMS > 2 THEN RETURN SETERROR(4, 0, 0)
LOCAL $ILAST = UBOUND($AARRAY) - 1
IF $IUBOUND = DEFAULT OR $IUBOUND > $ILAST THEN $IUBOUND = $ILAST
IF $IBASE < 0 OR $IBASE = DEFAULT THEN $IBASE = 0
IF $IBASE > $IUBOUND THEN RETURN SETERROR(5, 0, $IRETURN)
IF $SDELIMITER = DEFAULT THEN $SDELIMITER = "|"
LOCAL $HFILEOPEN = $SFILEPATH
IF ISSTRING($SFILEPATH) THEN
$HFILEOPEN = FILEOPEN($SFILEPATH, $FO_OVERWRITE)
IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, $IRETURN)
ENDIF
LOCAL $IERROR = 0
$IRETURN = 1
SWITCH $IDIMS
CASE 1
FOR $I = $IBASE TO $IUBOUND
IF NOT FILEWRITE($HFILEOPEN, $AARRAY[$I] & @CRLF) THEN
$IERROR = 3
$IRETURN = 0
EXITLOOP
ENDIF
NEXT
CASE 2
LOCAL $STEMP = ""
FOR $I = $IBASE TO $IUBOUND
$STEMP = $AARRAY[$I][0]
FOR $J = 1 TO UBOUND($AARRAY, $UBOUND_COLUMNS) - 1
$STEMP &= $SDELIMITER & $AARRAY[$I][$J]
NEXT
IF NOT FILEWRITE($HFILEOPEN, $STEMP & @CRLF) THEN
$IERROR = 3
$IRETURN = 0
EXITLOOP
ENDIF
NEXT
ENDSWITCH
IF ISSTRING($SFILEPATH) THEN FILECLOSE($HFILEOPEN)
RETURN SETERROR($IERROR, 0, $IRETURN)
ENDFUNC
FUNC _FILEWRITELOG($SLOGPATH, $SLOGMSG, $IFLAG = -1)
LOCAL $IOPENMODE = $FO_APPEND
LOCAL $SMSG = @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " : " & $SLOGMSG
IF $IFLAG = DEFAULT THEN $IFLAG = -1
IF $IFLAG <> -1 THEN
$IOPENMODE = $FO_OVERWRITE
$SMSG &= @CRLF & FILEREAD($SLOGPATH)
ENDIF
LOCAL $HFILEOPEN = $SLOGPATH
IF ISSTRING($SLOGPATH) THEN $HFILEOPEN = FILEOPEN($SLOGPATH, $IOPENMODE)
IF $HFILEOPEN = -1 THEN RETURN SETERROR(1, 0, 0)
LOCAL $IRETURN = FILEWRITELINE($HFILEOPEN, $SMSG)
IF ISSTRING($SLOGPATH) THEN $IRETURN = FILECLOSE($HFILEOPEN)
IF $IFLAG <> -1 AND NOT ISSTRING($SLOGPATH) THEN SETEXTENDED(1)
IF $IRETURN = 0 THEN RETURN SETERROR(2, 0, 0)
RETURN $IRETURN
ENDFUNC
FUNC _FILEWRITETOLINE($SFILEPATH, $ILINE, $STEXT, $BOVERWRITE = FALSE, $BFILL = FALSE)
IF $BOVERWRITE = DEFAULT THEN $BOVERWRITE = FALSE
IF $BFILL = DEFAULT THEN $BFILL = FALSE
IF NOT FILEEXISTS($SFILEPATH) THEN RETURN SETERROR(2, 0, 0)
IF $ILINE <= 0 THEN RETURN SETERROR(4, 0, 0)
IF NOT(ISBOOL($BOVERWRITE) OR $BOVERWRITE = 0 OR $BOVERWRITE = 1) THEN RETURN SETERROR(5, 0, 0)
IF NOT ISSTRING($STEXT) THEN
$STEXT = STRING($STEXT)
IF $STEXT = "" THEN RETURN SETERROR(6, 0, 0)
ENDIF
IF NOT ISBOOL($BFILL) THEN RETURN SETERROR(7, 0, 0)
LOCAL $AARRAY = FILEREADTOARRAY($SFILEPATH)
IF @ERROR THEN LOCAL $AARRAY[0]
LOCAL $IUBOUND = UBOUND($AARRAY) - 1
IF $BFILL THEN
IF $IUBOUND < $ILINE THEN
REDIM $AARRAY[$ILINE]
$IUBOUND = $ILINE - 1
ENDIF
ELSE
IF($IUBOUND + 1) < $ILINE THEN RETURN SETERROR(1, 0, 0)
ENDIF
$AARRAY[$ILINE - 1] = ($BOVERWRITE ? $STEXT : $STEXT & @CRLF & $AARRAY[$ILINE - 1])
LOCAL $SDATA = ""
FOR $I = 0 TO $IUBOUND
$SDATA &= $AARRAY[$I] & @CRLF
NEXT
$SDATA = STRINGTRIMRIGHT($SDATA, STRINGLEN(@CRLF))
LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, FILEGETENCODING($SFILEPATH) + $FO_OVERWRITE)
IF $HFILEOPEN = -1 THEN RETURN SETERROR(3, 0, 0)
FILEWRITE($HFILEOPEN, $SDATA)
FILECLOSE($HFILEOPEN)
RETURN 1
ENDFUNC
FUNC _PATHFULL($SRELATIVEPATH, $SBASEPATH = @WORKINGDIR)
IF NOT $SRELATIVEPATH OR $SRELATIVEPATH = "." THEN RETURN $SBASEPATH
LOCAL $SFULLPATH = STRINGREPLACE($SRELATIVEPATH, "/", "\")
LOCAL CONST $SFULLPATHCONST = $SFULLPATH
LOCAL $SPATH
LOCAL $BROOTONLY = STRINGLEFT($SFULLPATH, 1) = "\" AND STRINGMID($SFULLPATH, 2, 1) <> "\"
IF $SBASEPATH = DEFAULT THEN $SBASEPATH = @WORKINGDIR
FOR $I = 1 TO 2
$SPATH = STRINGLEFT($SFULLPATH, 2)
IF $SPATH = "\\" THEN
$SFULLPATH = STRINGTRIMLEFT($SFULLPATH, 2)
LOCAL $NSERVERLEN = STRINGINSTR($SFULLPATH, "\") - 1
$SPATH = "\\" & STRINGLEFT($SFULLPATH, $NSERVERLEN)
$SFULLPATH = STRINGTRIMLEFT($SFULLPATH, $NSERVERLEN)
EXITLOOP
ELSEIF STRINGRIGHT($SPATH, 1) = ":" THEN
$SFULLPATH = STRINGTRIMLEFT($SFULLPATH, 2)
EXITLOOP
ELSE
$SFULLPATH = $SBASEPATH & "\" & $SFULLPATH
ENDIF
NEXT
IF STRINGLEFT($SFULLPATH, 1) <> "\" THEN
IF STRINGLEFT($SFULLPATHCONST, 2) = STRINGLEFT($SBASEPATH, 2) THEN
$SFULLPATH = $SBASEPATH & "\" & $SFULLPATH
ELSE
$SFULLPATH = "\" & $SFULLPATH
ENDIF
ENDIF
LOCAL $ATEMP = STRINGSPLIT($SFULLPATH, "\")
LOCAL $APATHPARTS[$ATEMP[0]], $J = 0
FOR $I = 2 TO $ATEMP[0]
IF $ATEMP[$I] = ".." THEN
IF $J THEN $J -= 1
ELSEIF NOT($ATEMP[$I] = "" AND $I <> $ATEMP[0]) AND $ATEMP[$I] <> "." THEN
$APATHPARTS[$J] = $ATEMP[$I]
$J += 1
ENDIF
NEXT
$SFULLPATH = $SPATH
IF NOT $BROOTONLY THEN
FOR $I = 0 TO $J - 1
$SFULLPATH &= "\" & $APATHPARTS[$I]
NEXT
ELSE
$SFULLPATH &= $SFULLPATHCONST
IF STRINGINSTR($SFULLPATH, "..") THEN $SFULLPATH = _PATHFULL($SFULLPATH)
ENDIF
DO
$SFULLPATH = STRINGREPLACE($SFULLPATH, ".\", "\")
UNTIL @EXTENDED = 0
RETURN $SFULLPATH
ENDFUNC
FUNC _PATHGETRELATIVE($SFROM, $STO)
IF STRINGRIGHT($SFROM, 1) <> "\" THEN $SFROM &= "\"
IF STRINGRIGHT($STO, 1) <> "\" THEN $STO &= "\"
IF $SFROM = $STO THEN RETURN SETERROR(1, 0, STRINGTRIMRIGHT($STO, 1))
LOCAL $ASFROM = STRINGSPLIT($SFROM, "\")
LOCAL $ASTO = STRINGSPLIT($STO, "\")
IF $ASFROM[1] <> $ASTO[1] THEN RETURN SETERROR(2, 0, STRINGTRIMRIGHT($STO, 1))
LOCAL $I = 2
LOCAL $IDIFF = 1
WHILE 1
IF $ASFROM[$I] <> $ASTO[$I] THEN
$IDIFF = $I
EXITLOOP
ENDIF
$I += 1
WEND
$I = 1
LOCAL $SRELPATH = ""
FOR $J = 1 TO $ASTO[0]
IF $I >= $IDIFF THEN
$SRELPATH &= "\" & $ASTO[$I]
ENDIF
$I += 1
NEXT
$SRELPATH = STRINGTRIMLEFT($SRELPATH, 1)
$I = 1
FOR $J = 1 TO $ASFROM[0]
IF $I > $IDIFF THEN
$SRELPATH = "..\" & $SRELPATH
ENDIF
$I += 1
NEXT
IF STRINGRIGHT($SRELPATH, 1) == "\" THEN $SRELPATH = STRINGTRIMRIGHT($SRELPATH, 1)
RETURN $SRELPATH
ENDFUNC
FUNC _PATHMAKE($SDRIVE, $SDIR, $SFILENAME, $SEXTENSION)
IF STRINGLEN($SDRIVE) THEN
IF NOT(STRINGLEFT($SDRIVE, 2) = "\\") THEN $SDRIVE = STRINGLEFT($SDRIVE, 1) & ":"
ENDIF
IF STRINGLEN($SDIR) THEN
IF NOT(STRINGRIGHT($SDIR, 1) = "\") AND NOT(STRINGRIGHT($SDIR, 1) = "/") THEN $SDIR = $SDIR & "\"
ELSE
$SDIR = "\"
ENDIF
IF STRINGLEN($SDIR) THEN
IF NOT(STRINGLEFT($SDIR, 1) = "\") AND NOT(STRINGLEFT($SDIR, 1) = "/") THEN $SDIR = "\" & $SDIR
ENDIF
IF STRINGLEN($SEXTENSION) THEN
IF NOT(STRINGLEFT($SEXTENSION, 1) = ".") THEN $SEXTENSION = "." & $SEXTENSION
ENDIF
RETURN $SDRIVE & $SDIR & $SFILENAME & $SEXTENSION
ENDFUNC
FUNC _PATHSPLIT($SFILEPATH, BYREF $SDRIVE, BYREF $SDIR, BYREF $SFILENAME, BYREF $SEXTENSION)
LOCAL $AARRAY = STRINGREGEXP($SFILEPATH, "^\h*((?:\\\\\?\\)*(\\\\[^\?\/\\]+|[A-Za-z]:)?(.*[\/\\]\h*)?((?:[^\.\/\\]|(?(?=\.[^\/\\]*\.)\.))*)?([^\/\\]*))$", $STR_REGEXPARRAYMATCH)
IF @ERROR THEN
REDIM $AARRAY[5]
$AARRAY[$PATH_ORIGINAL] = $SFILEPATH
ENDIF
$SDRIVE = $AARRAY[$PATH_DRIVE]
IF STRINGLEFT($AARRAY[$PATH_DIRECTORY], 1) == "/" THEN
$SDIR = STRINGREGEXPREPLACE($AARRAY[$PATH_DIRECTORY], "\h*[\/\\]+\h*", "\/")
ELSE
$SDIR = STRINGREGEXPREPLACE($AARRAY[$PATH_DIRECTORY], "\h*[\/\\]+\h*", "\\")
ENDIF
$AARRAY[$PATH_DIRECTORY] = $SDIR
$SFILENAME = $AARRAY[$PATH_FILENAME]
$SEXTENSION = $AARRAY[$PATH_EXTENSION]
RETURN $AARRAY
ENDFUNC
FUNC _REPLACESTRINGINFILE($SFILEPATH, $SSEARCHSTRING, $SREPLACESTRING, $ICASESENSITIVE = 0, $IOCCURANCE = 1)
IF STRINGINSTR(FILEGETATTRIB($SFILEPATH), "R") THEN RETURN SETERROR(1, 0, -1)
LOCAL $HFILEOPEN = FILEOPEN($SFILEPATH, $FO_READ)
IF $HFILEOPEN = -1 THEN RETURN SETERROR(2, 0, -1)
LOCAL $SFILEREAD = FILEREAD($HFILEOPEN)
FILECLOSE($HFILEOPEN)
IF $ICASESENSITIVE = DEFAULT THEN $ICASESENSITIVE = 0
IF $IOCCURANCE = DEFAULT THEN $IOCCURANCE = 1
$SFILEREAD = STRINGREPLACE($SFILEREAD, $SSEARCHSTRING, $SREPLACESTRING, 1 - $IOCCURANCE, $ICASESENSITIVE)
LOCAL $IRETURN = @EXTENDED
IF $IRETURN THEN
LOCAL $IFILEENCODING = FILEGETENCODING($SFILEPATH)
$HFILEOPEN = FILEOPEN($SFILEPATH, $IFILEENCODING + $FO_OVERWRITE)
IF $HFILEOPEN = -1 THEN RETURN SETERROR(3, 0, -1)
FILEWRITE($HFILEOPEN, $SFILEREAD)
FILECLOSE($HFILEOPEN)
ENDIF
RETURN $IRETURN
ENDFUNC
FUNC _TEMPFILE($SDIRECTORYNAME = @TEMPDIR, $SFILEPREFIX = "~", $SFILEEXTENSION = ".tmp", $IRANDOMLENGTH = 7)
IF $IRANDOMLENGTH = DEFAULT OR $IRANDOMLENGTH <= 0 THEN $IRANDOMLENGTH = 7
IF $SDIRECTORYNAME = DEFAULT OR(NOT FILEEXISTS($SDIRECTORYNAME)) THEN $SDIRECTORYNAME = @TEMPDIR
IF $SFILEEXTENSION = DEFAULT THEN $SFILEEXTENSION = ".tmp"
IF $SFILEPREFIX = DEFAULT THEN $SFILEPREFIX = "~"
IF NOT FILEEXISTS($SDIRECTORYNAME) THEN $SDIRECTORYNAME = @SCRIPTDIR
$SDIRECTORYNAME = STRINGREGEXPREPLACE($SDIRECTORYNAME, "[\\/]+$", "")
$SFILEEXTENSION = STRINGREGEXPREPLACE($SFILEEXTENSION, "^\.+", "")
$SFILEPREFIX = STRINGREGEXPREPLACE($SFILEPREFIX, '[\\/:*?"<>|]', "")
LOCAL $STEMPNAME = ""
DO
$STEMPNAME = ""
WHILE STRINGLEN($STEMPNAME) < $IRANDOMLENGTH
$STEMPNAME &= CHR(RANDOM(97, 122, 1))
WEND
$STEMPNAME = $SDIRECTORYNAME & "\" & $SFILEPREFIX & $STEMPNAME & "." & $SFILEEXTENSION
UNTIL NOT FILEEXISTS($STEMPNAME)
RETURN $STEMPNAME
ENDFUNC
GLOBAL $PARAEXIST
IF STRINGINSTR("0804 1004 1404 0004", @OSLANG) <> 0 THEN
GLOBAL $TIP = "已在运行!"
GLOBAL $TIP_LOAD[2] = ["正在激活", "正在启动"]
ELSEIF STRINGINSTR("0404 0c04 7C04", @OSLANG) <> 0 THEN
GLOBAL $TIP = "已在運行!"
GLOBAL $TIP_LOAD[2] = ["正在激活", "正在啟動"]
ELSE
GLOBAL $TIP = "is running."
GLOBAL $TIP_LOAD[2] = ["is activating", "is starting"]
ENDIF
IF _SINGLETON("HEU KMS Activator", 1) = 0 THEN
MSGBOX(262144 + 16, "HEU_KMS_Activator", "HEU KMS Activator " & $TIP)
EXIT
ENDIF
GLOBAL $HEU_KMS_SERVER = "kms-server.exe"
GLOBAL $PROGRESS_LABEL, $PROGRESS_LABEL_TEXT
GLOBAL $LOAD
IF $OSARCH = "x64" OR $OSARCH = "ARM64" THEN
$KMS = "x64\kms_x64.exe"
ELSE
$KMS = "x86\kms.exe"
ENDIF
IF @OSBUILD < 2600 THEN
MSGBOX(16, $HEU_MSGBOX, "HEU KMS Activator 不支持当前系统!", 10)
FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
EXIT
ENDIF
IF $CMDLINE[0] <> 0 THEN
$PARAEXIST = 1
$LOAD = "v" & $HEU_VER & " " & $TIP_LOAD[0] & "..."
$FILENAME = $CMDLINE[1]
IF STRINGINSTR($CMDLINERAW, "/?") <> 0 OR STRINGINSTR($CMDLINERAW, "-?") <> 0 THEN
_SILENT_PARAMETERS()
FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
EXIT
ELSEIF STRINGINSTR($CMDLINERAW, "/wpa") <> 0 OR STRINGINSTR($CMDLINERAW, "-wpa") <> 0 THEN
DIRCREATE($FILEINSTDIR)
_FIXWPA()
DIRREMOVE($FILEINSTDIR, 1)
FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
EXIT
ELSEIF STRINGINSTR($CMDLINERAW, "/spp") <> 0 OR STRINGINSTR($CMDLINERAW, "-spp") <> 0 THEN
FILEWRITE(@WINDOWSDIR & "\heurenewal.log", ">>[" & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "]")
RUNWAIT(@COMSPEC & " /c " & $SETENV & " & net start sppsvc || sc start sppsvc >> %windir%\heurenewal.log", @WINDOWSDIR, @SW_HIDE)
EXIT
ENDIF
ELSE
LOCAL $ID
$ID = MSGBOX(262144 + 64 + 4, $HEU_MSGBOX, $STATEMENT[0] & @CRLF & "" & @CRLF & $STATEMENT[1] & @CRLF & "" & @CRLF & $STATEMENT[2] & @CRLF & "" & @CRLF & $STATEMENT[3] & $STATEMENT[4])
IF $ID = 6 THEN
INIWRITE(@TEMPDIR & "\ScriptTemp.ini", "UserAgreement", "UA", "YES")
$LOAD = "v" & $HEU_VER & " " & $TIP_LOAD[1] & "..."
ELSE
FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
EXIT
ENDIF
ENDIF
FILEINSTALL("splashlogo.jpg", @TEMPDIR & "\splashlogo.jpg", 1)
IF STRINGINSTR($CMDLINERAW, "/nologo") = 0 THEN
$SPLASH_GUI = GUICREATE($LOAD, 400, 236, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
GUICTRLCREATEPIC(@TEMPDIR & "\splashlogo.jpg", 0, 0, 400, 236, -1, 1048576)
GUICTRLCREATELABEL($LOAD, 15, 10, 200, 20)
GUICTRLSETBKCOLOR(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICTRLSETCOLOR(-1, 16777215)
GUICTRLSETFONT(-1, 10, 400, 0, "微软雅黑")
IF @OSBUILD >= 6000 THEN
$PROGRESS_OLD = GUICTRLCREATEPROGRESS(355, 228, 30, 3)
ENDIF
$PROGRESS_LABEL = GUICTRLCREATELABEL("", 24, 195, 351, 6)
GUICTRLSETBKCOLOR($PROGRESS_LABEL, 16777215)
$PROGRESS_LABEL_TEXT = GUICTRLCREATELABEL("", 355, 210, 30, 14, 2)
GUICTRLSETCOLOR($PROGRESS_LABEL_TEXT, 16777215)
GUICTRLSETBKCOLOR($PROGRESS_LABEL_TEXT, $GUI_BKCOLOR_TRANSPARENT)
GUICTRLSETFONT($PROGRESS_LABEL_TEXT, 9, 300, 0, "Arial")
GUISETSTATE(@SW_SHOW, $SPLASH_GUI)
_PROGRESS(0)
ENDIF
LOCAL $TEMPFOLDERS = _FILELISTTOARRAY(@TEMPDIR)
FOR $I = 1 TO UBOUND($TEMPFOLDERS) - 1
IF STRINGINSTR($TEMPFOLDERS[$I], "_temp_heu") THEN
DIRREMOVE(@TEMPDIR & "\" & $TEMPFOLDERS[$I], 1)
ENDIF
NEXT
IF FILEEXISTS($FILEINSTDIR) THEN
DIRREMOVE($FILEINSTDIR, 1)
ENDIF
FILEDELETE($FILEINSTDIR & "\*.*")
_PROGRESS(10)
IF NOT FILEEXISTS($FILEINSTDIR) THEN
DIRCREATE($FILEINSTDIR)
ENDIF
FILEINSTALL("KMSmini.7z", $FILEINSTDIR & "\", 1)
FILEINSTALL("files.7z", $FILEINSTDIR & "\", 1)
FILEINSTALL("7Z.EXE", $FILEINSTDIR & "\", 1)
_PROGRESS(20)
RUNWAIT('"' & $FILEINSTDIR & '\7Z.EXE"' & ' x "' & $FILEINSTDIR & '\KMSmini.7z"' & ' -y -o"' & $FILEINSTDIR & '"', @TEMPDIR, @SW_HIDE)
_PROGRESS(30)
FILESETATTRIB($FILEINSTDIR & "\*.*", "+H")
FILESETATTRIB($FILEINSTDIR, "+H")
FILEDELETE($FILEINSTDIR & "\KMSmini.7z")
IF $CMDLINE[0] <> 0 THEN
$FILENAME = $CMDLINE[1]
_FILEWRITEDEBUG($HEU_DEBUG, $HEU_MSGBOX & " Parameters " & $CMDLINERAW & @CRLF)
ELSE
GUIDELETE($SPLASH_GUI)
RUNWAIT($FILEINSTDIR & "\" & $KMS)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/kd1") OR STRINGINSTR($CMDLINERAW, "-kd1") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kd1", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/kd2") OR STRINGINSTR($CMDLINERAW, "-kd2") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kd2", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/od1") OR STRINGINSTR($CMDLINERAW, "-od1") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /od1", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF STRINGINSTR($CMDLINERAW, "/od2") OR STRINGINSTR($CMDLINERAW, "-od2") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /od2", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(10)
IF STRINGINSTR($CMDLINERAW, "/smart") OR STRINGINSTR($CMDLINERAW, "-smart") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /smart", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(30)
IF STRINGINSTR($CMDLINERAW, "/dig") OR STRINGINSTR($CMDLINERAW, "-dig") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /dig", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(35)
IF STRINGINSTR($CMDLINERAW, "/wts") OR STRINGINSTR($CMDLINERAW, "-wts") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /wts", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(40)
IF STRINGINSTR($CMDLINERAW, "/k38") OR STRINGINSTR($CMDLINERAW, "-k38") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /k38", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(45)
IF STRINGINSTR($CMDLINERAW, "/ots") OR STRINGINSTR($CMDLINERAW, "-ots") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /ots", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(50)
IF STRINGINSTR($CMDLINERAW, "/ohk") OR STRINGINSTR($CMDLINERAW, "-ohk") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /ohk", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(55)
IF STRINGINSTR($CMDLINERAW, "/kwi") OR STRINGINSTR($CMDLINERAW, "-kwi") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kwi", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(60)
IF STRINGINSTR($CMDLINERAW, "/lok") OR STRINGINSTR($CMDLINERAW, "-lok") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /lok", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(65)
IF STRINGINSTR($CMDLINERAW, "/wxp") OR STRINGINSTR($CMDLINERAW, "-wxp") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /wxp", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(70)
IF STRINGINSTR($CMDLINERAW, "/r2v") OR STRINGINSTR($CMDLINERAW, "-r2v") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /r2v", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(75)
IF STRINGINSTR($CMDLINERAW, "/kof") OR STRINGINSTR($CMDLINERAW, "-kof") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /kof", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(80)
IF STRINGINSTR($CMDLINERAW, "/ren") OR STRINGINSTR($CMDLINERAW, "-ren") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /ren", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(85)
IF STRINGINSTR($CMDLINERAW, "/unr") OR STRINGINSTR($CMDLINERAW, "-unr") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /unr", $FILEINSTDIR, @SW_HIDE)
ENDIF
_PROGRESS(90)
IF STRINGINSTR($CMDLINERAW, "/reb") OR STRINGINSTR($CMDLINERAW, "-reb") THEN
RUNWAIT($FILEINSTDIR & "\" & $KMS & " /reb", $FILEINSTDIR, @SW_HIDE)
ENDIF
IF $PARAEXIST = 1 THEN
PROCESSCLOSE($HEU_KMS_SERVER)
PROCESSCLOSE("kms.exe")
PROCESSCLOSE("kms_x64.exe")
DIRREMOVE(@WINDOWSDIR & "\HeuKmsLog", 1)
FILEDELETE(@WINDOWSDIR & "\HeuKmsRenewal\HEU_KMS_Activator.exe")
FILEDELETE(@WINDOWSDIR & "\splashlogo.jpg")
FILEDELETE(@WINDOWSDIR & "\ScriptTemp.ini")
FILEDELETE(@TEMPDIR & "\splashlogo.jpg")
FILEDELETE(@TEMPDIR & "\ScriptTemp.ini")
DIRREMOVE($FILEINSTDIR, 1)
ENDIF
EXIT
FUNC _PROGRESS($A)
IF STRINGINSTR($CMDLINERAW, "/nologo") = 0 THEN
CONTROLMOVE($SPLASH_GUI, "", $PROGRESS_LABEL, 24, 195, $A / 100 * 351, 6)
GUICTRLSETDATA($PROGRESS_LABEL_TEXT, $A & "%")
IF @OSBUILD >= 6000 THEN
GUICTRLSETDATA($PROGRESS_OLD, $A)
ENDIF
ENDIF
ENDFUNC
; DeTokenise by myAut2Exe >The Open Source AutoIT/AutoHotKey script decompiler< 2.15 build(212)
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
@LaDidi21
-> Décryptage des liens du forum : extension "ThiWeb Crypt / Decrypt"™ ou Thiweb Live <-
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité