Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Как получить данные из TStringGrid другой проги |
Автор: psychedeler 22.8.2008, 17:16 |
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 28.8.2008, 17:38 |
Извини, досконально не разбирался в твоём коде, так как сразу из названия темы понятно, что ты не очень понимаешь суть обмена данными между процессами в WIN32. Извини, без обид, прими как данность. Данные, которые должны быть переданы одним процессом другому, должны инициатором передачи помещаться в общую область памяти двух процессов. Сама система реализует вопрос межпроцессной передачи данных с помощью файла подкачки. ![]() А теперь по-русски: в файле подкачки процесс-инициатор размещает данные, процесс-приёмник считывает оттуда данные: один процесс размещает в файле подкачки данные из стринггрида, другой их оттуда считывает. Всё просто. Копай в сторону CreateFileMapping, в MSDN всё очень подробно описано. |
Автор: aldari 29.8.2008, 13:36 |
Из первого абзаца psychedeler'а понятно что программа с прайсом не написана им самим и изменить её нет возможности. Я правильно понял? psychedeler свяжись со мной через личку вместе напишем программу. Я намереваюсь использовать именно WIN32 API. У меня был схожый вопрос. |
Автор: psychedeler 5.9.2008, 06:31 |
Уж и не надеялся, что кто-либо занимается подобными вопросами... 1) Программа, действительно, стороннего разработчика. 2) Относительно MSDN - это как "искать иголку...", месяцы пройдут, прежде чем что-то подходящее найду и напишу. |
Автор: THandle 6.9.2008, 13:26 |
Вот статья о том как получить данные из TStringGrid в чужом процессе, правда она в Делфи разделе, но может быть будет полезна: http://forum.vingrad.ru/articles/topic-226725.html |
Автор: psychedeler 7.9.2008, 15:49 |
Спасибо. Анализирую статью...перевожу на C++ |