007wan |
Отправлено: 09 Мая, 2019 - 12:49:07
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Я недавно где-то про это писал, что нужно найти установленную программу через external.
А сейчас мне нужно тоже самое, только уже принцип чуть изменен:
-Найти установленную мазилу.
Если нашел: узнать версию, узнать какая битная версия (32 или 64), имя, путь итд..(это основные были).
Если версия 47.0.1 и она 32 битная, то вывести отдельное сообщение, если нет, то тоже, но уже, что "не 47.0.1 и не 32 бит."
Если не нашел: вывести отдельное сообщение.
Где-то это было, но принцип чуть другой и тоже в отдельной теме и мне сложно найти. |
|
|
Zireael |
Отправлено: 09 Мая, 2019 - 19:02:12
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Найти установленную мазилу
code (Отобразить)CODE:#define HKEY_LOCAL_MACHINE -2147483646
#define KEY_ALL_ACCESS 983103
#define KEY_WOW64_64KEY 256
external(INT, "RegOpenKeyEx", "RegOpenKeyExA", "Advapi32.dll" );
external(INT, "RegCloseKey", "RegCloseKey", "Advapi32.dll" );
external(INT, "RegQueryValueEx", "RegQueryValueExA", "Advapi32.dll" );
external(INT, "RegEnumKeyEx", "RegEnumKeyExA", "Advapi32.dll" );
string path="SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; // путь
string name_programm="Mozilla"; // имя программы
string parametr="DisplayIcon"; // параметр
char result[255], section[255];
int rKey, byte=255, programm_install=0, size_buffer=sizearray(section);
string path_to_exe;
string rn=formatic(13)+formatic(10);
string version, bit;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, address(#rKey))==0)
{
for(int i=0; RegEnumKeyEx(rKey, i, address(#section[0]), address(#size_buffer), 0, 0, 0, 0)==0; i++) // перебор всех подразделов
{
//messagebox(format(#sector[0]));
if(regexsearch(1, #path_to_exe, format(#section[0]), name_programm)) // поиск подраздела, в котором есть слово 'Mozilla'
{
RegCloseKey(rKey);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path+"\"+format(#section[0]), 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, address(#rKey))==0)
{
if(RegQueryValueEx(rKey, parametr, 0, 0, address(#result[0]), address(#byte))==0) // получить значение REG_SZ
{
programm_install=1;
break;
}
RegCloseKey(rKey);
}
}
size_buffer=sizearray(section);
}
if(programm_install) // если программа установлена
{
messagebox(format(#section[0]));
messagebox("Путь к exe: "+rn+format(#result[0]));
if(regexsearch(1, #version, format(#section[0]), "[\d\.]+"))messagebox(version);
else messagebox("Версия не определена");
if(regexsearch(1, #bit, format(#section[0]), "x\d{2}+"))messagebox(bit);
else messagebox("Разрядность не определена");
}
else
{
messagebox("Мозилла не установлена");
}
} |
|
|
Zireael |
Отправлено: 10 Мая, 2019 - 12:46:05
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: находит ту, которую нужно
Находит ту что первая в списке и останавливает поиск.
Цитата: где та строчка, где он находит нужную версию и нужный браузер?
CODE:regexsearch(1, #version, format(#section[0]), "[\d\.]+" )
Цитата: не вижу текста в коде что-то подобие этому "47.0.1"
"[\d\.]+" означает искать текст состоящий из чисел от 0 до 9 или точек. |
|
|
Zireael |
Отправлено: 10 Мая, 2019 - 13:15:19
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: И перебирал все мазилы, если их несколько
code (Отобразить)CODE:#define HKEY_LOCAL_MACHINE -2147483646
#define KEY_ALL_ACCESS 983103
#define KEY_WOW64_64KEY 256
external(INT, "RegOpenKeyEx", "RegOpenKeyExA", "Advapi32.dll" );
external(INT, "RegCloseKey", "RegCloseKey", "Advapi32.dll" );
external(INT, "RegQueryValueEx", "RegQueryValueExA", "Advapi32.dll" );
external(INT, "RegEnumKeyEx", "RegEnumKeyExA", "Advapi32.dll" );
string path="SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; // путь
string name_programm="Mozilla"; // имя программы
string parametr="DisplayIcon"; // параметр
char section[255];
int rKey, byte=255, programm_install=0, size_buffer=sizearray(section);
string path_to_exe;
string rn=formatic(13)+formatic(10);
string version, bit;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, address(#rKey))==0)
{
for(int i=0; RegEnumKeyEx(rKey, i, address(#section[0]), address(#size_buffer), 0, 0, 0, 0)==0; i++) // перебор всех подразделов
{
//messagebox(format(#section[0]));
if(regexsearch(1, #path_to_exe, format(#section[0]), name_programm)) // поиск подраздела, в котором есть слово 'Mozilla'
{
RegCloseKey(rKey);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path+"\"+format(#section[0]), 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, address(#rKey))==0)
{
find(format(#section[0]));
RegCloseKey(rKey);
}
}
size_buffer=sizearray(section);
}
}
else
{
messagebox("Мозилла не установлена");
}
function find(string s)
{
messagebox(s);
// тут проверять что нужно
} |
|
|
007wan |
Отправлено: 10 Мая, 2019 - 13:47:57
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael , Честно говоря, я не нашел отличия, кроме как создания отдельной функции и отсутствия парсинга для версии и для бита. Но да ладно. Буду надеется, что он будет искать все мазилы и находить нужную версию и нужный бит.
Пока так сделал:CODE:if(regexsearch(1, #version, format(#section[0]), "[\d\.]+"))
{
if (version == "47.0.1")
{
messagebox(version);
}
else
{
messagebox("Версия не определена");
}
}
if(regexsearch(1, #bit, format(#section[0]), "x\d{2}+"))
{
if (bit == "x86")
{
messagebox(bit);
}
else
{
messagebox("Разрядность не определена");
}
}
(Добавление)Для чего мне нужно, что бы он искал все браузеры, а потому что может она встановлена не первая в списке
Zireael пишет:
Находит ту что первая в списке и останавливает поиск.
(Добавление)
Если можно код, где находит первую мазилу и вторую(лучше все) и показать первую мазилу через missagebox, а потом вторую и потом код уже заострится на второй или на первой, смотря какая версия и бит(47.0.1 и х86)(Отредактировано автором: 10 Мая, 2019 - 13:50:57) |
|
|
Zireael |
Отправлено: 10 Мая, 2019 - 13:57:36
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Так должно все разделы проверить:
code (Отобразить)CODE:#define HKEY_LOCAL_MACHINE -2147483646
#define KEY_ALL_ACCESS 983103
#define KEY_WOW64_64KEY 256
external(INT, "RegOpenKeyEx", "RegOpenKeyExA", "Advapi32.dll" );
external(INT, "RegCloseKey", "RegCloseKey", "Advapi32.dll" );
external(INT, "RegQueryValueEx", "RegQueryValueExA", "Advapi32.dll" );
external(INT, "RegEnumKeyEx", "RegEnumKeyExA", "Advapi32.dll" );
string path="SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; // путь
string name_programm="Mozilla"; // имя программы
string parametr="DisplayIcon"; // параметр
char section[255];
int rKey, rKey2, byte=255, programm_install=0, size_buffer=sizearray(section);
string path_to_exe;
string rn=formatic(13)+formatic(10);
string version, bit;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, address(#rKey))==0)
{
for(int i=0; RegEnumKeyEx(rKey, i, address(#section[0]), address(#size_buffer), 0, 0, 0, 0)==0; i++) // перебор всех подразделов
{
//messagebox(format(#section[0]));
if(regexsearch(1, #path_to_exe, format(#section[0]), name_programm)) // поиск подраздела, в котором есть слово 'Mozilla'
{
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path+"\"+format(#section[0]), 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, address(#rKey2))==0)
{
find(format(#section[0]));
RegCloseKey(rKey2);
}
}
size_buffer=sizearray(section);
}
RegCloseKey(rKey);
}
else
{
messagebox("Мозилла не установлена");
}
function find(string s)
{
messagebox(s);
// тут проверять что нужно
} |
|
|
|