![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
psychedeler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 22.8.2008 Репутация: нет Всего: нет |
1) Есть некоторая программа, содержащая прайс-лист, обновляемый через i-net.
2) Задача - выдрать прайс из объекта класса TStringGrid и сохранить его в текстовом, например, виде с разделителями. Облазил несколько мест и вот какие исходники получились: 1. Создается некая программка, позволяющая делать hook на какую-либо функцию другого процесса Вот единственный модуль программки: Создается форма...на ней TEdit Edit1, TEdit X, TEdit Y, TSpeedButtin SpeedButton1 Планируется, что X - номер строки целевой StringGrid Y - номер столбца Edit1 - текст, содержащийся в ячейке StringGrid->Cells[X][Y] SpeedButton1 - просто инициатор считывания Модуль main.cpp #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; HINSTANCE hHookDll; #define WM_SUPER=WM_USER+123; //структура данных, в которую по идее должны передаваться данные struct TRec { HWND Handle; BYTE Flag; int x; int y; char str[255]; }; //-------------------------------------------------------------------- ------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } int SetHook(BOOL bSet,DWORD forTh) // Функция устанавливает/снимает хук в зависимости от bSet { HHOOK hHook; if(bSet) // Если устанавливаем { if(hHookDll) // Если загружена библиотека { FARPROC hpHookProc = (HOOKPROC)GetProcAddress(hHookDll, "@HookProc$qqsiuip6tagMSG"); //здесь строка ""@HookProc$qqsiuip6tagMSG" была определена программой MonitoringFileBuilder.exe //которая есть в комплекте с WinAPIOverride32.v4.0.4.zip, скачанной откуда-то с этого сайта //Эта единственная функция dll, которую планируется внедрять в другой процесс. if(hpHookProc) // Если успешно получен адрес ф-ции, { // то установим хук hHook = SetWindowsHookEx(WH_GETMESSAGE, // тип хука (HOOKPROC)hpHookProc, // хук-функция hHookDll, // хендл библиотеки с хук-функцией forTh); //для процесса, который был найден if(hHook == NULL) // Если хук не установился, вернем ошибку return 3; } else return 1; } else return 2; } else // Если снимаем хук UnhookWindowsHookEx(hHook); return 0; } //-------------------------------------------------------------------- ------- void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { int flag=0; char classname[255]; AnsiString Str; TRec *P; HWND main_handle=NULL,child=NULL; DWORD Yo=NULL; main_handle=FindWindow(<Класс>,<Заголовок>); //параметры убраны в определенных целях if(main_handle!=NULL) { child=FindWindowEx(main_handle,0,"TStringGrid",NULL); if(child==NULL)return; } Yo=GetWindowThreadProcessId(main_handle,NULL); hHookDll = LoadLibrary("hook_dll.dll"); SetHook(true,Yo); (HGLOBAL)Yo=GlobalAlloc(GHND,sizeof(TRec)); //пытаемся получить данные (LPVOID)P=GlobalLock((HGLOBAL)Yo); P->Handle=child; P->Flag=0; P->x=StrToInt(X->Text); //обращаемся к структуре, вроде как хранящую данные из StringGrid P->y=StrToInt(Y->Text); GlobalUnlock((HGLOBAL)Yo); SendMessage(child,WM_USER+123,Yo,0); (LPVOID)P=GlobalLock((HGLOBAL)Yo); Edit1->Text=P->str; GlobalUnlock((HGLOBAL)Yo); GlobalFree((HGLOBAL)Yo); SetHook(false,0); 2. Создается dll - проект на Си один модуль cpp (перевод с дельфийского ![]() #define WM_SUPER=WM_USER+123; #pragma argsused struct TRec { HWND Handle; int x; int y; BYTE Flag; char str[255]; }; //-------------------------------------------------------------------- ------- __declspec(dllexport) LRESULT CALLBACK HookProc(int iCode,WPARAM wParam, MSG *msg) { TRec *P; TWinControl *W; if(iCode>=0) // Если iCode>=0, то данные нужно обработать { if(msg->message == HC_ACTION) { (LPVOID)P=GlobalLock((HGLOBAL)msg->wParam); W=FindControl(P->Handle); if(P!=NULL) { if(P->Flag==1) TStringGrid(W).Cells[P->x][P->y]=P->str; //тут в принципе можно пройтись по всем строкам StringGrid //и выгрузить их куда-нибудь. else { try{strcpy(P->str,TStringGrid(W).Cells[P->x][P->y].c_str());} catch(...) {strcpy(P->str,"");} } } GlobalUnlock((HGLOBAL)msg->wParam); } } else // Если iCode return CallNextHookEx(NULL, iCode, wParam, msg->lParam); return 0; } Эта хрень комилируется, но не работает... О WinAPI у меня очень смутные представления. Кто-нибудь подскажите... Где тут ошибка? Возможно ли в принципе получить доступ к StringGrid? Есть ли в сети программы, позволяющие получать данные из StringGrid другой программы? Если нет, готов выложить запрос на взлом.... (А вообще желательно исходники на Си для получения данных StringGrid другой программы с комментариями). Заранее благодарю. |
|||
|
||||
Stranger2048 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 21.12.2007 Репутация: нет Всего: нет |
Извини, досконально не разбирался в твоём коде, так как сразу из названия темы понятно, что ты не очень понимаешь суть обмена данными между процессами в WIN32. Извини, без обид, прими как данность. Данные, которые должны быть переданы одним процессом другому, должны инициатором передачи помещаться в общую область памяти двух процессов. Сама система реализует вопрос межпроцессной передачи данных с помощью файла подкачки.
![]() А теперь по-русски: в файле подкачки процесс-инициатор размещает данные, процесс-приёмник считывает оттуда данные: один процесс размещает в файле подкачки данные из стринггрида, другой их оттуда считывает. Всё просто. Копай в сторону CreateFileMapping, в MSDN всё очень подробно описано. |
|||
|
||||
aldari |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Из первого абзаца psychedeler'а понятно что программа с прайсом не написана им самим и изменить её нет возможности. Я правильно понял?
psychedeler свяжись со мной через личку вместе напишем программу. Я намереваюсь использовать именно WIN32 API. У меня был схожый вопрос. |
|||
|
||||
psychedeler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 22.8.2008 Репутация: нет Всего: нет |
Уж и не надеялся, что кто-либо занимается подобными вопросами...
1) Программа, действительно, стороннего разработчика. 2) Относительно MSDN - это как "искать иголку...", месяцы пройдут, прежде чем что-то подходящее найду и напишу. |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: нет Всего: 372 |
Вот статья о том как получить данные из TStringGrid в чужом процессе, правда она в Делфи разделе, но может быть будет полезна: http://forum.vingrad.ru/articles/topic-226725.html
|
|||
|
||||
psychedeler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 22.8.2008 Репутация: нет Всего: нет |
Спасибо. Анализирую статью...перевожу на C++
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |