![]() |
eXeL@B —› Вопросы новичков —› Как получить данные из объекта TStringGrid другой программы? |
Посл.ответ | Сообщение |
|
Создано: 22 августа 2008 10:01 · Поправил: psychodeler · Личное сообщение · #1 1) Есть некоторая программа, содержащая прайс-лист, обновляемый через i-net. 2) Задача - выдрать прайс из объекта класса TStringGrid. Облазил несколько мест и вот какие исходники получились: 1. Создается некая программка, позволяющая делать hook на какую-либо функцию другого процесса вот единственный модуль программки: #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, переделанный с Delphi #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 другой программы с комментариями). Заранее благодарю. ![]() |
|
Создано: 09 сентября 2008 18:00 · Поправил: psychodeler · Личное сообщение · #2 |
![]() |
eXeL@B —› Вопросы новичков —› Как получить данные из объекта TStringGrid другой программы? |