Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 (перевод с дельфийского  smile)

#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. Извини, без обид, прими как данность. Данные, которые должны быть переданы одним процессом другому, должны инициатором передачи помещаться в общую область памяти двух процессов. Сама система реализует вопрос межпроцессной передачи данных с помощью файла подкачки.  smile 
А теперь по-русски: в файле подкачки процесс-инициатор размещает данные, процесс-приёмник считывает оттуда данные: один процесс размещает в файле подкачки данные из стринггрида, другой их оттуда считывает. Всё просто. Копай в сторону 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++

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)