|
Вопрос # 6 367/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Подскажите пример кода как найти текст uses modified config file в окне Edit?
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: Adam264 (статус: Посетитель)
Вопрос отправлен: 27 января 2013, 17:03
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 5 февраля 2013, 01:15; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 28 января 2013, 08:15 [#1]:
Функция Pos() подойдёт?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Adam264 (статус: Посетитель), 28 января 2013, 13:26 [#2]:
Конечно подойдёт
|
|
Adam264 (статус: Посетитель), 4 февраля 2013, 14:06 [#3]:
Только на сколько я знаю функции Pos() заранее нужно передавать текст где искать, в моём же случае в процессе работы сервера в окно будут добавляться строки, которые тоже нужно обрабатывать. Эта функция подойдёт для построчного поиска или лучше использовать какую-то другую функцию?
|
|
min@y™ (статус: Доктор наук), 4 февраля 2013, 14:26 [#4]:
Цитата (Adam264):
Только на сколько я знаю функции Pos() заранее нужно передавать текст где искать
Верно.
Цитата (Adam264):
в процессе работы сервера в окно будут добавляться строки, которые тоже нужно обрабатывать
Ну и что? Есть текст, есть искомый фрагмент. Больше ничего не нужно.
Цитата (Adam264):
Эта функция подойдёт для построчного поиска или лучше использовать какую-то другую функцию?
Естественно, текст можно и на строки отдельные разбить, если это необходимо, и в цикле искать подстроку построчно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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;
Как видно функция возвращает первый попавшыйся адрес(за исключением адреса строки которая является аргументом этой функции)
Главное сильно захотеть и проблема всегда решается
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|