Помоигите с Делфи!

Blendd 08.05.2004 - 10:48 | Прблема такая, у меня есть только откомпилированная программа, и в общем считает каке-то там значения, моя прорамма должна эти значения взять и их проанализировать. как мне это сделать программно?
Sabrian 1 - 08.05.2004 - 14:02 | ???? Тебе известны эти значения? - Анализируй на здоровье......
Blendd 2 - 08.05.2004 - 14:04 | мне надо чтоб прога атоматически их брала
Sabrian 3 - 08.05.2004 - 14:56 | Хм... Откуда именно?
Blendd 4 - 08.05.2004 - 16:27 | из другой программы, от которой у меня нет изходников. а точнее из Tedit'ов той программы
Blendd 5 - 08.05.2004 - 16:34 | там что то с api функциями
x77 6 - 08.05.2004 - 16:51 | Blendd, . 1. запустить ту программу из своей (CreateProcess), получив таким образом её Handle . 2.зная её Handle, получить Handle нужных компонентов (FindWindow, EnumWindows - способов много). . 3.Получить значения самих компонентов (GetWindowText) . только учти, что сами эти Edit'ы могут лежать (и скорее всего, лежат) не на самой главной форме, а на какой-то панели. . . а вообще - дебильство это всё.
archimag 7 - 08.05.2004 - 20:14 | Есть более общий подход, позволяющий извлекать данные из программы, даже если они отображаются не с помощью editов и их нельзя получить функцией GetWindowText. Если несколько раз в различных ситуациях просканировать виртуальное адресное пространство интересующей тебя программы, то можно вычислить место в памяти, где хранится искомое значение. Это можно сделать самому или с помощью взломщика игр. Далее, в адресное пространство интересующего тебя процесса загружаешь свой dll-модуль, который читает данные по заранее определённому адресу и пересылает твоей программе. Всё...
x77 8 - 08.05.2004 - 22:45 | 2 archimag, угу. всё. особенно, если учесть, что функции, которые используются для внедрения в чужие процессы в windows.pas не прописаны, и юзать их в своей программе - задача явно не для Blendd'а.
Blendd 9 - 09.05.2004 - 00:05 | =) ну опустили прям ниже плинтуса =) Edit'ы лежат на главной форме. А можно более подробно, если не тьрудно о handlah и т.д.
x77 10 - 09.05.2004 - 00:14 | крутая, наверное, прога. у которой едиты на главной форме. . да напиши свою, что она такого сложного там считает?
x77 11 - 09.05.2004 - 00:18 | Blendd, насчёт опустили - такого намерения не было, просто я пишу не для того, чтобы сумничать самому, а чтобы, по возможности, реально помочь. способов масса: можно, например, программно снять скриншот окна, в заданных координатах вырезать текст, и перевести его из картинки в строку. работы - для на три-четыре, при обилии свободного времени - на день. но с наскоку такие вещи не делаются, если раньше ты с ними не сталкивался. вариант с хэндлами самый простой.
Blendd 12 - 09.05.2004 - 00:22 | прога на самом деле не очень сложная но муторная.. там туева хуча всяких методов типа симплексного, просто начинается все со второстепенных форм и к концу тока сводится на главную. легче взять пару занчений нежели перписывать все самому
x77 13 - 09.05.2004 - 01:00 | хэндл - это дескриптор любого окна (помимо всего прочего). окном в терминологии винды (не дельфей!) считается любой компонент, собственно, обладающей хэндлом, а не только форма. существуют апишные функции для поиска нужного окна как среди главных окон приложения, так и среди дочерних окон, принадлежащих данному окну. . получить хэндл главного окна можно ф-ией FindWindow (описание есть в SDK). далее, можно просто тупо перебирать контролы и вытаскивать из них все значения, типа: . function EnumProc (hwndChild : HWND; lP : LPARAM) : boolean; stdcall; begin Form1.ListBox1.Items.Add(IntToHex(hwndChild, 8)); Result := true; end; .. begin EnumChildWindows(hwndParent, @EnumProc, 0); end;
x77 14 - 09.05.2004 - 01:19 | т.е. сам перебор делается через callback-функцию.
archimag 15 - 09.05.2004 - 02:09 | 1. запускаешь spy и определяешь порядковый номер N интересующего тебя окна в Z-последовательности, просто считаешь количество предшествующих дочерних окон, ну или просто подбираешь методом тыка 2. Определяшь дескриптор главной формы hwndForm=FindWindow( NULL, надпись_на_главной_форме ) 3. Получаешь дескриптор первого дочернего компонента hwndChild=GetWindow(hwndForm,GW_CHILD) 4. N-1 раз вызываешь hwndChild=GetNextWindow(hwndChild,GW_HWNDNEXT) 5. Получаешь содержание edit GetWindowText( hwndChile,буфер, размер_буфера), буфер - массив в который будет записана строка из окна в виде массива символов с \0 в конце, под него необходимо выделить память, необходимый размер буфера можно узнать вызовом GetWindowTextLength(hwndChild) 6. задача решена
x77 16 - 09.05.2004 - 02:24 | archimag, имя класса в FindWindow - это pchar, передать туда null компилятор просто не позволит, только nil или 0 (который автоматически будет преобразован в тот же нил, правда, с варнингом :)).
x77 17 - 09.05.2004 - 02:41 | да и З-порядок олпрделять смысла нет, ибо автор сабжа уверен, что всё лежит на главной форме... а поскольку едитов, как я понимаю несколько, я бы всё-таки сделал через EnumChildWindows. ну да хозяин - барин.
Delphist 18 - 09.05.2004 - 14:57 | Да, EnumChildWindows - просто и без головняков. Только не забудь 1) функцию-енумератор объявить как stdcall 2) Результат функции должен быть True до тех пор, пока не нашел нужный Window. Тогда можно сделать результат False или продолжать искать дальше (если нужно несколько дочерних окон за один проход).
Blendd 19 - 10.05.2004 - 10:22 | Спасибо =) буду биться
Eretic 20 - 11.05.2004 - 10:36 | ваще я думаю легче будет взять и переписать прогу,алгоритм то хоть помнишь,или не знаешь как написать,помочь(
BugMaker 21 - 12.05.2004 - 19:27 | Альтернативное решение: Сделать скриншот, сконвертировать его в тиф, из тифа в jpeg, распечатать и написать свой распознаватель текста. А можно не писать а выковырять из FineReader'а (ну это для ленивых) :)
Sabrian 22 - 13.05.2004 - 12:47 | Распознаватель текста. Ну точно - вариант для "ленивых"!!!

>>