Сейчас на форуме: _MBK_, Rio (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Как получить данные из объекта TStringGrid другой программы?
Посл.ответ Сообщение

Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 другой программы с комментариями).
Заранее благодарю.



Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 сентября 2008 18:00 · Поправил: psychodeler
· Личное сообщение · #2

Единственный пока приемлимый вариант http://forum.vingrad.ru/articles/topic-226725.html http://forum.vingrad.ru/articles/topic-226725.html


 eXeL@B —› Вопросы новичков —› Как получить данные из объекта TStringGrid другой программы?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати