Тема: AHK: определение разрядности процесса
В скриптах часто приходится узнавать разрядность процесса, т.к. от этого зависят смещения в большинстве структур.
UPD: размер указателя в байтах хранится во встроенной переменной A_PtrSize, поэтому текст между /* и */ не актуален.
/*Самый простой способ: инициализируем участок памяти в 8 байт нулями и пишем туда указатель- теперь в 32-битной системе старшее двойное слово осталось нулевым(т.к. указатель имеет длину 4 байта), а в 64-битной перезаписалось и теперь неравно нулю. Пример:
VarSetCapacity(test, 8, 0)
NumPut(-1, &test, 0, "ptr")
if(!NumGet(&test, 4, "int"))
msgbox 32-bit process
else
msgbox 64-bit process
*/
Если нужно определить не только разрядность процесса, но и архитектуру, то можно воспользоваться функциями GetNativeSystemInfo и IsWow64Process:
SystemType := GetSystemType()
if(SystemType = 0x8000)
msgbox x86
else if(SystemType&0x8000)
{
SystemType &= 0x7FFF
if(SystemType=9)
msgbox x64(32-bit process)
else if(SystemType=6)
msgbox AI64(32-bit process)
else
msgbox unknown
}
else
{
if(SystemType=9)
msgbox x64
else if(SystemType=6)
msgbox AI64
else
msgbox unknown
}
return
GetSystemType()
{
VarSetCapacity(SystemInfo, 48, 0)
VarSetCapacity(Wow64Process, 4, 0)
DllCall("GetNativeSystemInfo", "ptr", &SystemInfo)
ProcType := NumGet(&SystemInfo, 0, "uint")
if(ProcType=0)
return 0x8000
else if(ProcType!=0xffff)
{
if(DllCall("IsWow64Process", "ptr", -1, "ptr", &Wow64Process))
{
if(NumGet(&Wow64Process, 0, "int")=0)
return ProcType
else
return ProcType|0x8000
}
}
return 0
}