Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить данные из TStringGrid другой проги 
:(
    Опции темы
psychedeler
Дата 22.8.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 (перевод с дельфийского  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 другой программы с комментариями). 
Заранее благодарю. 

PM MAIL   Вверх
Stranger2048
Дата 28.8.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.12.2007

Репутация: нет
Всего: нет



Извини, досконально не разбирался в твоём коде, так как сразу из названия темы понятно, что ты не очень понимаешь суть обмена данными между процессами в WIN32. Извини, без обид, прими как данность. Данные, которые должны быть переданы одним процессом другому, должны инициатором передачи помещаться в общую область памяти двух процессов. Сама система реализует вопрос межпроцессной передачи данных с помощью файла подкачки.  smile 
А теперь по-русски: в файле подкачки процесс-инициатор размещает данные, процесс-приёмник считывает оттуда данные: один процесс размещает в файле подкачки данные из стринггрида, другой их оттуда считывает. Всё просто. Копай в сторону CreateFileMapping, в MSDN всё очень подробно описано.
PM MAIL   Вверх
aldari
Дата 29.8.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Из первого абзаца psychedeler'а понятно что программа с прайсом не написана им самим и изменить её нет возможности. Я правильно понял?

psychedeler свяжись со мной через личку вместе напишем программу. Я намереваюсь использовать именно WIN32 API. У меня был схожый вопрос.
PM MAIL   Вверх
psychedeler
Дата 5.9.2008, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.8.2008

Репутация: нет
Всего: нет



Уж и не надеялся, что кто-либо занимается подобными вопросами...
1) Программа, действительно, стороннего разработчика.

2) Относительно MSDN - это как "искать иголку...", месяцы пройдут, прежде чем что-то подходящее найду и напишу.
PM MAIL   Вверх
THandle
Дата 6.9.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: нет
Всего: 372



Вот статья о том как получить данные из TStringGrid в чужом процессе, правда она в Делфи разделе, но может быть будет полезна: http://forum.vingrad.ru/articles/topic-226725.html
PM   Вверх
psychedeler
Дата 7.9.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.8.2008

Репутация: нет
Всего: нет



Спасибо. Анализирую статью...перевожу на C++
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0932 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.