Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 367

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Подскажите пример кода как найти текст uses modified config file в окне Edit?

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Adam264 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Adam264 (статус: Посетитель)
Вопрос отправлен: 27 января 2013, 17:03
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 5 февраля 2013, 01:15; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 28 января 2013, 08:15 [#1]:

Функция Pos() подойдёт?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Adam264

Adam264 (статус: Посетитель), 28 января 2013, 13:26 [#2]:

Конечно подойдёт :-)
Adam264

Adam264 (статус: Посетитель), 4 февраля 2013, 14:06 [#3]:

Только на сколько я знаю функции Pos() заранее нужно передавать текст где искать, в моём же случае в процессе работы сервера в окно будут добавляться строки, которые тоже нужно обрабатывать. Эта функция подойдёт для построчного поиска или лучше использовать какую-то другую функцию?
min@y™

min@y™ (статус: Доктор наук), 4 февраля 2013, 14:26 [#4]:

Цитата (Adam264):

Только на сколько я знаю функции Pos() заранее нужно передавать текст где искать

Верно.

Цитата (Adam264):

в процессе работы сервера в окно будут добавляться строки, которые тоже нужно обрабатывать

Ну и что? Есть текст, есть искомый фрагмент. Больше ничего не нужно.

Цитата (Adam264):

Эта функция подойдёт для построчного поиска или лучше использовать какую-то другую функцию?

Естественно, текст можно и на строки отдельные разбить, если это необходимо, и в цикле искать подстроку построчно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
QWERYTY

QWERYTY (статус: Посетитель), 5 февраля 2013, 01:15 [#5]:

Ну в принципе если не находится нужная функция то можно и самому написать

Вот например мне нужно было перехватывать данные с окошек одной програмки. С помощью ArtMoney я увидел интересующие меня данные в памяти процесса, и как они меняются вместе с изменениями в окнах. Функции естественно не нашлось, и я написал вот такую:
  // ФУНКЦИЯ ИЩЕТ СТРОКУ В ПАМЯТИ ПРОЦЕССА
  // ЕСЛИ НАЙДЕНО ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА ПЕРВЫЙ СИМВОЛ
function GetStrAddr(const Str: AnsiString): POINTER; stdcall;
var
Mbi: TMemoryBasicInformation;
Buf: PAnsiChar;
AddrString: POINTER;
Match, RegionAddr, HProcess, ProcessID, BytesRead, LengthStr, I, J: CARDINAL;
begin
   result := NIL;
   LengthStr := Length(Str);
   HProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or PROCESS_VM_OPERATION, FALSE,
GetCurrentProcessID);
   if HProcess = 0 then Exit else
   begin
      RegionAddr := 0;
      while VirtualQueryEx(HProcess, POINTER(RegionAddr), Mbi, SizeOf(Mbi)) <> 0 do
      begin
         if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
         begin
            GetMem(Buf, Mbi.RegionSize);
            try
               // Читаем память регионами в буфер
            if ReadProcessMemory(HProcess, Mbi.BaseAddress, Buf, Mbi.RegionSize, BytesRead) then
            begin
                 // Сравниваем символы в буфере с первым символом строки
               for I := 0 to BytesRead - LengthStr  do
               begin
                    // Если совпал сравниваем остальные
                  if Buf[I] = Str[1] then
                  begin
                     Match := 0;
                     for J := 0 to LengthStr - 1 do
                     begin
                        if Buf[I + J] = Str[J + 1] then Match := Match + 1;
                        end;
                     if Match = LengthStr then
                     begin
                        AddrString := POINTER(CARDINAL(Mbi.BaseAddress) + I);
                        if AddrString <> Addr(Str[1])  then result := AddrString;
                        end;
                     end;
                  end;
               end
            else
            finally
               FreeMem(Buf);
               end;
            end;
         RegionAddr := RegionAddr + Mbi.RegionSize;
         end;
      end;
   CloseHandle(HProcess);
end;

Как видно функция возвращает первый попавшыйся адрес(за исключением адреса строки которая является аргументом этой функции)

Главное сильно захотеть и проблема всегда решается
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 27 марта 2023, 00:56
Выполнено за 0.03 сек.
Рейтинг@Mail.ru