Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798

ListView и правильность\оптимизация кода

17.11.2011, 19:04. Показов 1411. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех.

Вопросов несколько:
1. Запутался с последовательностью выполнения команд
2. Как записать результат проверки в третью колонку компонента ListView (установлен в стиле отчёт) Беда в том, что порой при проверке контрольной суммы на VirusTotal(VT) программа генерирует ошибку, и вывод в третью колонку уже идёт ошибочный
Code
1
2
3
   case 10060: // Истёк таймаут
   MessageBox(0, "Истёк таймаут ожидания запроса к VirusTotal", 0, MB_OK + MB_ICONWARNING);
   break;
например:
Файл 1 - МД5 12345 (я точно знаю что это вирус)
Файл 2 - МД5 67890 (чистый)
При сообщении об истечении срока ожидания, в колонку результат для первого файла, выводится отчёт от второго файла.

Программа имеет две кнопки Button1, Button2. Первая кнопка Button1 открывает файлы и вычисляет контрольные суммы, заполняя ListView оставляя третью колонку пустой(а пустой ли и вообще она есть?), вторая кнопка Button2 происводит считывание второй колонки ListView содержащей MD5 в массив lMD5 и отправку его в поток QueryThread на обработку. Вывод результатов у меня в обработчике IdHTTP1Redirect

Собственно, проверьте исходник, как правильно организовать вывод проверки сервиса VT в третью колонку ListView, чтобы каждому MD5 соответствовал свой отчёт сервиса или заполнение его прочерком если сервис превысил таймаут.

Если не сложно и будет время покажите как правильно нужно сделать, я третий день бьюсь уже, ничего не могу придумать.
Исходный код программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "md5wrapper.h"
#include "tinyxml/tinystr.h"
#include "tinyxml/tinyxml.h"
#include "CheckMD5VT.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdHTTP"
#pragma link "IdTCPClient"
#pragma link "IdTCPConnection"
#pragma resource "*.dfm"
TForm1 *Form1;
TListItem  *ListItem;
AnsiString NameFile;
const unsigned int NUM_INDENTS_PER_SPACE = 2;
const unsigned int TD_COUNT = 4;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
// Здесь происходит обращение к серверу
DWORD WINAPI QueryThread(LPVOID lpParam)
{
   TStringList *lHash = (TStringList *)lpParam;
   TStringList *post = new TStringList;
   TStringStream *response = new TStringStream();
 
   for(int i = 0; i < lHash->Count; i++){
      post->Clear();
      post->Add("chain=" + lHash->Strings[i]);
      try{
         Form1->IdHTTP1->Post("http://www.virustotal.com/search.html", post, response);
        }
      catch(EIdHTTPProtocolException &se){
         switch(se.ErrorCode){
            case 200: //всё ок
            break;
            case 303:
            break;  //редирект
            case 404: //404 not found
            break;
            default:
            break;
           }
        }
      catch(EIdSocketError &se){
//       MessageBox(0, se.Message.t_str(), 0, 0);
         switch(se.LastError){
            case 11001: // Нет инета
            MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
            break;
            case 10060: // Истёк таймаут
            MessageBox(0, "Истёк таймаут ожидания запроса к VirusTotal", 0, MB_OK + MB_ICONWARNING);
            break;
            default:
            break;
           }
        }
      Form1->IdHTTP1->Disconnect();
     }
   delete post, response, lHash;
   return 0;
}
// Открытие файлов и расчёт их MD5-------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   md5wrapper md5;
   if (OpenDialog1->Execute()){
      for(int i = 0; i < OpenDialog1->Files->Count; i++){
         NameFile = OpenDialog1->Files->Strings[i];
         std::string hash1 = md5.getHashFromFile(NameFile.c_str()); // create a hash from a string
         ListItem = Form1->ListView1->Items->Add();
         ListItem->Caption = NameFile;
         ListItem->SubItems->Add(String(hash1.c_str()).UpperCase());
        }
     }
}
// По нажатию на кнопку происходит проверка на сервисе VT-------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   TStringList *lMD5 = new TStringList;
   for(int i = 0; i < ListItem->ListView->GetCount(); i++){
      lMD5->Add(ListItem->ListView->Items->Item[i]->SubItems->Strings[0]);// Strings[i]);
     }
 
   try{
      IdHTTP1->Get("http://www.virustotal.com/search.html");
      HANDLE hThread;
      hThread = CreateThread(0, 0, QueryThread, lMD5, 0, 0);
      if(hThread == INVALID_HANDLE_VALUE){
         ShowMessage("Не возможно создать поток");
         return;
        }
      CloseHandle(hThread);
     }
   catch(EIdHTTPProtocolException &se){
      switch(se.ErrorCode){
         case 200: //всё ок
         break;
         case 303:
         break;  //редирект
         case 404: //404 not found
         break;
         default:
         break;
        }
     }
   catch(EIdSocketError &se){
      switch(se.LastError){
         case 11001: // Нет инета
         MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
         break;
//       case 10060: // Истёк таймаут
//       MessageBox(0, "Истёк таймаут ожидания запроса к VirusTotal", 0, MB_OK + MB_ICONWARNING);
//       break;
        }
     }
}
//---------------------------------------------------------------------------
...
// Здесь происходит парсинг странички, с использованием
// "tinyxml", по вопросу не имеет значения, но если нужно, выложу
...
//---------------------------------------------------------------------------
void __fastcall TForm1::IdHTTP1Redirect(TObject *Sender, UnicodeString &dest, int &NumRedirect,
          bool &Handled, UnicodeString &VMethod)
{
   if(dest == "http://www.virustotal.com/search.html?notfound=1"){ // Когда МД5 ещё НЕ проверялась на VT
      Memo1->Lines->Add("Файл с таким MD5 проверку не проходил");
      return;
     }
   TResult result;
   AnsiString res = IdHTTP1->Get(dest);
   ParseXml(res, result);
 
   int antivirus_count = result.size();
   int true_res = 0;
   int procent;
 
   for(TResult::iterator i = result.begin(); i != result.end(); i++){
      if(i->result != "-"){
         true_res++;
        }
     }
 
   procent = true_res * 100 / antivirus_count; //получили процент
   if(ComboBox1->Text.ToInt() <= procent){
      Memo1->Lines->Add("Файл с таким MD5 детектируется как вирус");
     }
   else{
      Memo1->Lines->Add("Файл с таким MD5 детектируется как чистый");
     }
}
//---------------------------------------------------------------------------


Спасибо.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2011, 19:04
Ответы с готовыми решениями:

Проверьте правильность кода (обработка значений матрицы)
Задание ниже: 1) Вычислить матрицу по формуле. {a}_{ij}=2({2}^{i+1})(i-3,9)(j\left|2-\frac{3}{i+1} \right|), где i=0,...,4; j=0,...,5. ...

Оптимизация кода
Приветствую всех. Посмотрите на нижеприведенный код. Возможно ли сделать его проще (например без использования AnsiString и/или цикла)? ...

Оптимизация кода
У меня в программе обилие циклов, внутри них в основном расчеты и работа с массивами. Имеет ли смысл производить ассемблерные вставки в...

6
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
17.11.2011, 22:35
Цитата Сообщение от Maestro Посмотреть сообщение
При сообщении об истечении срока ожидания, в колонку результат для первого файла, выводится отчёт от второго файла.
Как мне сказали отсчет идет от -1 а не от 0(ноля)!!!
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
17.11.2011, 23:26
C++
1
TListItem  *ListItem;
Вот это в глобальной памяти - сразу требует переноса хотя бы в private TForm1. А если используется только внутри отдельно-взятой процедуры как буфер -то в процедуре ему место.
ListItem->ListView->Items->Item[i]->SubItems->Strings[0]
А вот после этого окончательно запутался))
Вы можете точнее сформулировать задачу? То что полностью изложили суть и привели почти полный листнг это конечно хорошо, но в данном случае имхо столько подробностей излишни. Вам нужно как заполнить N-нный столбец в ListView?
0
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
18.11.2011, 20:15  [ТС]
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Вы можете точнее сформулировать задачу?
В принципе как точнее уже не знаю. Мне казалось что обрисовал всё что можно. Проблемки две
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Вам нужно как заполнить N-нный столбец в ListView?
Совершенно верно, мне нужно заполнить N-й стоблец, в нашем случае третий.



Только заполнение происходит после проверки (кнопка Button2). Но, как я уже говорил, из-за того что порой сервис VT не отвечает на запросы программы, программа генерирует ошибку 10060 (истёк таймаут ожидания), после чего поле результата проверки файла, на который VT не ответил остаётся пустым, а вот итог проверки следующего файла пишется именно в поле результата проверки первого файла. (Это когда я вывожу в мемо, вижу такое несоответствие, а в ListView вывести не могу правильно)

На скрине видно несколько МД5. Представьте что проверяются они все, но первый, самый первый не смог провериться (истёк таймаут), в этом случае проверка продолжается со второй МД5, но результат проверки пишется для первой МД5, тоесть не соответствует МД5 и итог проверки.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
18.11.2011, 23:25
Цитата Сообщение от Maestro Посмотреть сообщение
Совершенно верно, мне нужно заполнить N-й стоблец, в нашем случае третий.
Напомню, что строки в ListView как и 90% других нумеруются начиная с 0!

Если строки НЕ существует.
C++
1
2
3
4
5
6
7
8
ListView1->Items->Add();
// добавить новую строку в список.
ListView1->Items->Item[ListView1->Items->Count-1]->Caption = "T0";
// изменить нулевой элемент строки ( так как мы ее только что добавили, то последней).
ListView1->Items->Item[ListView1->Items->Count-1]->SubItems->Add("T1");
// добавить первый элемент в строку.
ListView1->Items->Item[ListView1->Items->Count-1]->SubItems->Add("T2");
// добавить второй элемент в строку.
Если строка существует.
C++
1
2
3
4
5
6
ListView1->Items->Item[x]->SubItems->Strings[n] = "E"+(IntToStr(n+1);
// изменить [N+1] элемент строки номер x.
ListView1->Items->Item[x]->SubItems->Strings[0] = "E1";
// изменить первый элемент строки номер x.
ListView1->Items->Item[x]->SubItems->Strings[1] = "E2";
// изменить второй элемент строки номер x.
0
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
19.11.2011, 14:42  [ТС]
DefineTrueFalse, Вы бы не могли показать как это должно выглядеть в этом участке кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//---------------------------------------------------------------------------
void __fastcall TForm1::IdHTTP1Redirect(TObject *Sender, UnicodeString &dest, int &NumRedirect,
                  bool &Handled, UnicodeString &VMethod)
{
   if(dest == "http://www.virustotal.com/search.html?notfound=1"){ // Когда МД5 ещё НЕ проверялась на VT
      Memo1->Lines->Add("Файл с таким MD5 проверку не проходил");
      return;
     }
   TResult result;
   AnsiString res = IdHTTP1->Get(dest);
   ParseXml(res, result);
 
   int antivirus_count = result.size();
   int true_res = 0;
   int procent;
 
   for(TResult::iterator i = result.begin(); i != result.end(); i++){
      if(i->result != "-"){
         true_res++;
        }
     }
 
   procent = true_res * 100 / antivirus_count; //получили процент
   if(ComboBox1->Text.ToInt() <= procent){
      Memo1->Lines->Add("Файл с таким MD5 детектируется как вирус");
     }
   else{
      Memo1->Lines->Add("Файл с таким MD5 детектируется как чистый");
     }
}
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
19.11.2011, 18:32
Цитата Сообщение от Maestro Посмотреть сообщение
Вы бы не могли показать как это должно выглядеть в этом участке кода
Нет, ибо мне не понятно какие данные брать и когда использовать добавление. Может быть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define FAIL_URL "http://www.virustotal.com/search.html?notfound=1"
#define mdFileVirus "Файл с таким MD5 детектируется как вирус"
#define mdFileClear "Файл с таким MD5 детектируется как чистый"
#define mdFileDknow "Файл с таким MD5 проверку не проходил"
// ...
void __fastcall TForm1::IdHTTP1Redirect(TObject *Sender, UnicodeString &dest, int &NumRedirect,
                  bool &Handled, UnicodeString &VMethod)
{
    ListView1->Items->Add();
    // добавляем строку.
    if (dest != FAIL_URL)
    // проходил ли файл проверку...
    {
        /* некие ваши вычесления и проделки */
 
        ListView1->Items->Item[ListView1->Items->Count-1]->SubItems->Add("Сумма MD5");
        // тут нужно добавить значение MD5.
 
        if (ComboBox1->Text.ToIntDef(-1) <= procent)
            ListView1->Items->Item[ListView1->Items->Count-1]->Caption = mdFileVirus;
            // изменяем строку, т.к. вирус.
        else 
            ListView1->Items->Item[ListView1->Items->Count-1]->Caption = mdFileClear;
            // изменяем строку, т.к. чист.
        
        ListView1->Items->Item[ListView1->Items->Count-1]->SubItems->Add("Результат");
        // здесь нужно результат записать, мб сюда нужно было вирус/чист писать, но я хз)
    }
    else ListView1->Items->Item[ListView1->Items->Count-1]->Caption = mdFileDknow;
    // изменяем строку, ибо хз.
}
// ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2011, 18:32
Помогаю со студенческими работами здесь

Оптимизация кода
Вот решил написать что то на подобии &quot;Напоминания события&quot;!))) Вот код: ...

Оптимизация кода
Исходный код: //////разбор//// String html_data =_T(&quot;&quot;); innerRe-&gt;ModifierM = true; innerRe-&gt;Expression =...

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона для функции 2*X12 - X1*X2 + 3*X22 -...

Оптимизация проверки на правильность данных
Добрый день! Мне нужна ваша помощь вот по такому вопросу: есть таблица со следующими данными: &quot;город&quot;, &quot;улица&quot;,...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока кода/отдельной функции или процедуры/программы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru