Поиск программ на компьютере

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Поиск программ на компьютере

Сообщение mrkaban » 13.02.2017 12:29:03

Здравствуйте Уважаемые Форумчане!

Сразу хочу предупредить, что я новичок!

Есть реализованный механизм обнаружения установленных программ.

1)получаем список установленных программ из реестра
2)формируем SQL запрос со всеми этими программами
3)выполняем запрос и открываем результат в dbgrid

Но при таком варианте встречается проблема - в базе должна быть 1 в 1 запись. То есть, берём из реестра название 2ГИС 3.16.3.0, и в базе соответственно должно быть такое же.

Думал, что может лучше наоборот из базы искать программы на компьютере, чтобы можно было использовать что-то вроде '2ГИС%', но комбинация получается какая-то слишком сложная, и запрос просто громадный.

Может кто посоветует более эффективный способ. Или вариант улучшения. Код могу показать, проект опенсоурс.
mrkaban
новенький
 
Сообщения: 55
Зарегистрирован: 28.05.2016 09:48:18

Re: Поиск программ на компьютере

Сообщение pupsik » 13.02.2017 14:26:48

Чем like '%ГИС%' не устроил?

п.с
Код могу показать, проект опенсоурс
дык может с этого и начали бы?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Поиск программ на компьютере

Сообщение mrkaban » 13.02.2017 14:45:17

Процедура большая, сразу пугать людей не хочу=) думаю мало кто захочет вникать в код новичка

Благодарен за любые советы!

MyList2: TStringListUTF8; Объявлена как глобальная переменная, в ней хранится DisplayName
Код: Выделить всё
procedure TfMian.mBeginSerchClick(Sender: TObject);
var
   MyList: TStringListUTF8;     // для хранения названий ключей реестра
   MyRegistry: TRegistry;
     s: string;
     i : integer;
//     p: Integer;
FiltrStr: string;
   Str: string;
     N:integer;        // для записи в базу списка
begin
Cursor:= crHourGlass;
bSearch.Visible:=False;    //скрываем кнопку начать поиск
//       // очищаем старое содержимое
        SQLQuery1.Close;                               // очиска таблицы в базе, в которую
        SQLQuery1.SQL.Text := 'delete from install';    //  записывается список программ
        SQLQuery1.ExecSQL;
        SQLTransaction1.CommitRetaining;
//
  MyList2:=TStringListUTF8.Create;
MyRegistry:=TRegistry.Create(KEY_WOW64_64KEY);
MyList:=TStringListUTF8.Create;

  with MyRegistry do
        begin
        RootKey:=HKEY_LOCAL_MACHINE;
        OpenKeyReadOnly('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\');
        GetKeyNames(MyList);
        CloseKey;
        for i:=0 to MyList.Count-1 do
           begin
           RootKey:=HKEY_LOCAL_MACHINE;
           OpenKeyReadOnly('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'+
           MyList[i]);
           Str:=ReadString('DisplayName');
           if Str<>'' then
           MyList2.Add(CP1251ToUTF8(ReadString('DisplayName')));
           CloseKey;
           end;

        RootKey:=HKEY_LOCAL_MACHINE;
        OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\');
        GetKeyNames(MyList);
        CloseKey;
        for i:=0 to MyList.Count-1 do
           begin
           RootKey:=HKEY_LOCAL_MACHINE;
           OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+
           MyList[i]);
           Str:=ReadString('DisplayName');
           if Str<>'' then
           MyList2.Add(CP1251ToUTF8(ReadString('DisplayName')));
           CloseKey;
           end;
          end;


   //   
  SQLQuery1.Close;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add('insert into install(text)');     //    Запись полученного списка прог в базу
  SQLQuery1.SQL.Add('Values (:pText)');
  for N := 0 to MyList2.Count - 1 do
  begin
    SQLQuery1.ParamByName('pText').AsString := MyList2[N];
    SQLQuery1.ExecSQL;
  end;
  SQLTransaction1.CommitRetaining;

  SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Text:='select text from install';
SQLQuery1.Open;
SQLQuery1.First;
MyList2.clear;                   // пытался из базы получать список прог
while not SQLQuery1.Eof do
begin
  MyList2.Add(SQLQuery1.FieldByName('text').AsString);
  SQLQuery1.Next;
end;
SQLQuery1.Close;

         //пробую удалить кавычки
  MyList2.Text  := StringReplace(MyList2.Text, '"', '', [rfReplaceAll, rfIgnoreCase]);
       with MyList2.Create do
  try
    MyList2.StrictDelimiter := true;
    s := '';
    for i := 0 to MyList2.Count - 1 do if Trim(MyList2.Strings[i]) <> '' then
      s := s + Format('%s(name LIKE "%s")', [IfThen(i = 0, '', ' OR '), MyList2.Strings[i]]);
    s := 'SELECT * FROM program WHERE ' + s + ' ORDER BY id';
  finally
  //  Free;
  end;


  // всё, в s хранится запрос, его и используй для получения данных из БД
//  Showmessage(s);

  MyList.Free;
SQLQuery1.Close;
SQLQuery1.Active:=false;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add(s);
SQLQuery1.Active:=true;
SQLQuery1.Open;

            //заполняем заголовки колонок и меняем ширину колонок
DBGrid1.Columns[1].Title.Caption:='Название';
DBGrid1.Columns[2].Title.Caption:='Тип ПО';
DBGrid1.Columns[3].Title.Caption:='Лицензия';
DBGrid1.Columns[4].Title.Caption:='Стоимость';
DBGrid1.Columns[5].Title.Caption:='Замена';
DBGrid1.Columns[1].Width:= 200;
DBGrid1.Columns[2].Width:= 150;
DBGrid1.Columns[3].Width:= 110;
DBGrid1.Columns[4].Width:= 90;
DBGrid1.Columns[5].Width:= 150;

end;


Код работает, если кто нибудь захочет посмотреть, дам ссылку на исходный код.

У меня как раз и используется конструкция like ''%N%'. Трудно объяснить, проблема другая. Из DisplayName я получаю название программы уже с версией, и соответственно это уже не like '%ГИС%', а like '%2ГИС 3.16.3.0%'.
mrkaban
новенький
 
Сообщения: 55
Зарегистрирован: 28.05.2016 09:48:18


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

Рейтинг@Mail.ru