Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Реализация доступа к VCL объектам другой программы (внешнего процесса)

490
18 октября 2007 года
frid-karatel
357 / / 15.09.2007
Как нажать на TToolBar в другой программе и получить значение прогресса TCGauge другой программы?

Думаю, что через FindWindowA(), но программы, захватывающие HWND (ID) объекта (напр. InqSoft Window Scanner) не хотят видеть их HWND.

Как поступить в данной ситуации?

PS: Есть доступ к форме жругой программы через ResHacker (или Restorator)
Страницы:
240
18 октября 2007 года
aks
2.5K / / 14.07.2006
Ну насколько я помню многие борландовские контролы создаются не в виде окон, как это обычно в винде, а для каких то целей рисуються и обрабатываются полностью вручную. Поэтому FindWindow их найти не может - там просто нет окна.
490
18 октября 2007 года
frid-karatel
357 / / 15.09.2007
и как быть в таком случае?
Есть ли какие-нибудь методы реализации того, что мне необходимо сделать?

Можно ли как-то изменить ресурс формы, чтобы находило HWND?
240
19 октября 2007 года
aks
2.5K / / 14.07.2006
Юзать WInAPI для создания GUI или библиотеки построенные на классическом его исспользорвании.
490
19 октября 2007 года
frid-karatel
357 / / 15.09.2007
а поподробнее? ничего не понятно - что дальше делать...
3.2K
19 октября 2007 года
nikipelovav
152 / / 12.04.2006
Я когда-то столкнулся с проблемой посылки сообщений другим программам и, в результате, написал небольшую тестовую программу.
Она включена в мой исходник "ProjBeam" (раздел "Другое" ). Проект называется TestLib, находится в папке \Projects\TestLib. На закладке "Сообщения Windows" кнопка с вызовом нужного диалога. Исходный код в файле "BSendMess.cpp" и "BSendMess.h".

У меня в программе есть TToolBar. Я смог из диалога TestLib нажать на кнопку в TToolBar. Разбирайся и у тебя всё получится. ;)
490
19 октября 2007 года
frid-karatel
357 / / 15.09.2007
спасибо, nikipelovav, буду смотреть ;) а как быть с TCGauge?
3.2K
19 октября 2007 года
nikipelovav
152 / / 12.04.2006
С TCGauge проблематичней.

Я запустил долгий процесс в своеё программе.
Он использует шкалу TCGauge на панели TPanel с кнопкой TButton.
К сожадению "видны" только TPanel и TButton.

Надо думать ... ;)
490
19 октября 2007 года
frid-karatel
357 / / 15.09.2007
Вот-вот... а можно как-нибудь изменить ресурсы в exe-файле так, чтобы можно было контролировать... например, заменить на TProgressBar? Конечно смешно имхо можно изменить только имя и положение.... но никак не тип компонента... но все же...
1
19 октября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: frid-karatel
Как нажать на TToolBar в другой программе и получить значение прогресса TCGauge другой программы?

Думаю, что через FindWindowA(), но программы, захватывающие HWND (ID) объекта (напр. InqSoft Window Scanner) не хотят видеть их HWND.

Как поступить в данной ситуации?

PS: Есть доступ к форме жругой программы через ResHacker (или Restorator)


Необходимо найти главное окно - а потом запустить перебор дочерних окон.
В МСДН написано по моему черным по белому:

Цитата:

This function does not search child windows.


Контрол окна - он чилд виндоус и есть.

490
20 октября 2007 года
frid-karatel
357 / / 15.09.2007
Получается, в программах типа InqSoft WindowScanner используются немного неверные функции по поиску HWND?

PS: Можно какой-нибудь пример использования функций?
246
20 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
Получается, в программах типа InqSoft WindowScanner используются немного неверные функции по поиску HWND?

PS: Можно какой-нибудь пример использования функций?


ну написали же тэбэ - получил главное окно, затем перебираешь дочернии, затем у них дочернии и т.д.
http://www.google.ru/search?complete=1&hl=ru&q=enumchildwindows&lr=

246
20 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: aks
Ну насколько я помню многие борландовские контролы создаются не в виде окон, как это обычно в винде, а для каких то целей рисуються и обрабатываются полностью вручную. Поэтому FindWindow их найти не может - там просто нет окна.


да ну? а если посмотреть в comctrls.pas (TToolBar):)

490
20 октября 2007 года
frid-karatel
357 / / 15.09.2007
InqSoft WindowScanner по поводу дочерних окон вообще выдает 3-5 контролов из 20... Т.е. он не обрабтывает ни TToolButton, ни TCGauge, ни TMainMenu...
1
20 октября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: frid-karatel
Получается, в программах типа InqSoft WindowScanner используются немного неверные функции по поиску HWND?

PS: Можно какой-нибудь пример использования функций?


Код:
char buff[256],buff2[256];
bool __stdcall ChildEnumerate(HWND hWind,LPARAM lParam){
 SendMessage(hWind,WM_GETTEXT,sizeof(buff),(LPARAM)(LPCTSTR)buff);
 GetClassName(hWind,buff2,sizeof(buff2));
Form1->mmListChildWind->Lines->Add(String(buff)+"-\t ClassName\t-"+String(buff2));
return true;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
HWND hWind=NULL;
hWind = this->Handle;
SendMessage(hWind,WM_GETTEXT,sizeof(buff),(LPARAM)(LPCTSTR)buff);
 GetClassName(hWind,buff2,sizeof(buff2));
Form1->mmListChildWind->Lines->Add(String(buff)+"-\t ClassName\t-"+String(buff2));
while(hWind){
 EnumChildWindows(hWind,(WNDENUMPROC)ChildEnumerate,0);
 hWind =GetNextWindow(hWind,GW_HWNDPREV);
}
}
//---------------------------------------------------------------------------
490
20 октября 2007 года
frid-karatel
357 / / 15.09.2007
а команды (сообщения) такие же?
для TToolButton как для обычной TButton?
для TCGauge как для обычного TProgressBar?
490
20 октября 2007 года
frid-karatel
357 / / 15.09.2007
kot_, твой код не помог... :( нашле только ToolBar1, а вот кнопки - нет.

Ни TToolButton, ни TCGauge - этих не нашло...

Как быть? Если бы вопрос был простой, я бы его к "Новичкам" отправил, а по поводу сканеров и т.д. - не зря писал, что они тоже не находят...

Я тут статейку про AMS прочитал - а что, если встроить в exe-файл той программы, где кнопки находятся, свой код, так зказать, доп. TProgressBar и Еигеещтб которыми я и буду оперировать, а при нажатии на наих "прыгать" на необходимый адрес, т.е. на процедуру TToolButton и TCGauge соответственно? Конечно - это извращенство, но что ж делать... Это так, на крайний случай.. ;)

PS: как заголовок темы поменять? :)
3.2K
20 октября 2007 года
nikipelovav
152 / / 12.04.2006
Ну почемуже справку никто не читает? ;)

Класс TCGauge порождён от TGraphicControl, который , как написано в справке, является облегчённым вариантом TWinControl.
И если дальше в справку посмотреть, то у TGraphicControl нет свойства Handle! Вот поэтому нет окна объекта TCGauge.

Код:
TGraphicControl is the base class for all lightweight controls.

Unit

Controls

Description

TGraphicControl supports simple lightweight controls that do not need the
ability to accept keyboard input or contain other controls. Since lightweight
controls do not wrap Windows screen objects, they are faster and user
fewer resources than controls based on TWinControl.

TGraphicControl provides a Canvas property for access to the control's
drawing surface and a virtual Paint method called in response to paint
requests received by the parent control.
490
21 октября 2007 года
frid-karatel
357 / / 15.09.2007
nikipelovav, и что же мне делать тогда? :( как мне узнать значение TCGauge? В память другого процесса рыться?

PS: во блин капец...
3.2K
21 октября 2007 года
nikipelovav
152 / / 12.04.2006
Ты можешь свою задачу сформулировать. Может тогда тебе подскажут другое решение.
490
21 октября 2007 года
frid-karatel
357 / / 15.09.2007
Имеется программа стороннего разработчика (ПСР). ПСР использует для обработки данные из файла set.ini. Моя программа (МП) подставляет необходимые данные в этот файл.

Чтобы пользователю было удобно и чтобы не светить ПСР, я решил ее запускать через SW_HIDE, и нажимать TToolButton "Start". После нажатия ПСР выполняет действия и выводит статус выполения (заверщения) задачи на TCGauge. Чтобы как-то отображать статус в МП, я думал получать через, скажем, каждые 2 сек сообщения от TCGauge о статусе выполнения.

И сразу возникли две проблемы:
1. Не могу работать с TToolButton, так как не удается получить Handle.
2. Не могу работать с TCGauge, так как не удается получить Handle.

Пробовал через разные сканеры, но результат тот же - этих контролов не видно. Также не видно и TLabel... но это ладно - мне она не нужна...

Как нажать кнопку и получить статус выполнения?

Доп. информация: ПСР не зажата упаковщиками, не зашифрована, можно спокойно декомпилировать и получить нахвания всех процедур, форм и т.п. вещей.

Как быть?
246
21 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
а команды (сообщения) такие же?
для TToolButton как для обычной TButton?


нет они начинаются с TB_ и отправляются через SendMessage, например:

Код:
int __fastcall TCNToolBar::GetActualWidth()
{
    //TODO: Add your source code here
    RECT rcButton;
    int iWidth = 0;
    int nCount = ::SendMessage(m_hWnd, TB_BUTTONCOUNT, 0, 0);
    for(int i = 0; i < nCount; i++)
    {
        ::SendMessage(m_hWnd, TB_GETITEMRECT, i, (LPARAM)&rcButton);
        iWidth += (rcButton.right - rcButton.left);
    }

    return  iWidth;
}


ЗЫ: МСДН читаем!
3.2K
21 октября 2007 года
nikipelovav
152 / / 12.04.2006
Нажать нужную кнопку TToolButton можно.
Найди окно TToolBar.
Определи его размер и вычисли координаты приблизительной середины
кнопки "Start". По этим координатам пошли сообщение о клике левой
кнопки мыши. Если ты скачал мой исходник, там всё есть для этого. ;)

А по поводу TCGauge, определив окно, в котором он отображается,
делай (периодически) копию картинки в окно своей программы.

Если в окне ПСР есть кнопка "Прервать" определи её координаты, и по
нажатию на аналогичную в твоей программе посылай сообщение
о клике левой кнопки мыши.

А, может проще, связаться с разработчиками ПСР и взять код?
Или это "большой секрет" ;)
490
21 октября 2007 года
frid-karatel
357 / / 15.09.2007
А если формы не видно, как быть? клик ведь не сработает...
Я думаю, что можно через SendMessage отправить горячую клавишу этой кнопки...

Кстати, а как быть с TCGauge?
3.2K
21 октября 2007 года
nikipelovav
152 / / 12.04.2006
Не уверен, но возможно ты сможешь отобразить окно ПСР,
но сдвинуть его, например влево, за границы экрана.
При этом, делая активным окно ПСР, чтобы оно ловило сообщения,
пользователь всёравно ничего не увидит.
1
21 октября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: frid-karatel
kot_, твой код не помог... :( нашле только ToolBar1, а вот кнопки - нет.

Ни TToolButton, ни TCGauge - этих не нашло...

Как быть? Если бы вопрос был простой, я бы его к "Новичкам" отправил, а по поводу сканеров и т.д. - не зря писал, что они тоже не находят...

Я тут статейку про AMS прочитал - а что, если встроить в exe-файл той программы, где кнопки находятся, свой код, так зказать, доп. TProgressBar и Еигеещтб которыми я и буду оперировать, а при нажатии на наих "прыгать" на необходимый адрес, т.е. на процедуру TToolButton и TCGauge соответственно? Конечно - это извращенство, но что ж делать... Это так, на крайний случай.. ;)

PS: как заголовок темы поменять? :)



Для контрола который сам содержит дочерние окна перебор необходимо выполнять тоже.
TCGauge находит. Другое дело что он не отображает корректно имя класса - с этим разбирайся сам. Тем более что контрол присутствует в палитре билдера только как пример - и если ты его используешь то проблемы эти твои и только твои.

490
21 октября 2007 года
frid-karatel
357 / / 15.09.2007
может попытаться через ASM? я где-то видел пример того, как в блокнот вставляют функцию от TCalc, в результате чего блокнот может вычислять результат функций...

так вот что я подумал... менять заголовок формы или какой-либо кнопки, эдита на форме GCH при изменении значения TCGauge, т.е. в обработку функции, в которой изменяется значение TCGauge, воткнуть доп. код, которые будет изменять значение (или надпись) какого-нибудь контрола...? как такой вариант?
490
21 октября 2007 года
frid-karatel
357 / / 15.09.2007
nikipelovav
Цитата:
А, может проще, связаться с разработчиками ПСР и взять код?
Или это "большой секрет"



Они - китайцы :) их программа работает с китайским оборудованием... Я пытался взять код - и взял... но дело в том, что оборудование обновляется, и программа тоже... в итоге у меня исходники версии 2.0, а уже 4.0... Дальше - больше, 5.0, 6.0 и т.д. Думаю, лучше придумать какой-нибудь алгоритм по управлению программой, чем постоянно просить исходники... тем более как у них просить, если у них только сайт - и все :) ни почты, ни телефона, ни города или провинции, ни адреса... только сайт с иероглифами...

Я вот уже третий раз думаю... может через ASM вставить свой код в программу? адрес процедур найти не сложно, т.к. можно разкомпилировать, останется только выучить ASM.. :) :)

246
22 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
может попытаться через ASM? я где-то видел пример того, как в блокнот вставляют функцию от TCalc, в результате чего блокнот может вычислять результат функций...


Идея такая:
Надо внедрить свою длл в этот процесс (хук, удаленный поток) и попробовать обратится к Appplication, если получится то дальше дело техники. Есть же VCL Property Viewer, который в любой программе на БСБ/Делфи кажет все св-ва. Это только догадки как он на самом делеработает х.з.

490
22 октября 2007 года
frid-karatel
357 / / 15.09.2007
я кстати тоже думал про подключаемую dll... но толку то нет - как получить значение TCGauge? кнопка TToolButton - фиг с ней, а вот как получить статус?

Была еще такая идея - на примере ArtMoney - искать данные в памяти процесса... скорей всего, данные о прогрессе имеют постоянный адрес, так как смысла делать его динамическим нет...

Итак, какие варианты?
246
22 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
я кстати тоже думал про подключаемую dll... но толку то нет - как получить значение TCGauge?


ищЁ раз...
1. Прикрутить Dll
2. Ты в адресном пространстве целевого процесса, у каждого VCL приложения есть глобальная переменная Application (тип ТApplication), у каждого Application есть св-во MainForm ... дальше продолжать?

490
22 октября 2007 года
frid-karatel
357 / / 15.09.2007
неплохо было бы :)

а как ее прикрутить?

кстати, так, для расслабления:
Дураки учатся на своих ошибках, умные на чужих... Получается, что дураки учат умных... :)
Где-то случайно на форуме каком-то нашел...
246
23 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
неплохо было бы :)
а как ее прикрутить?


установить ловушку(hook), например:
http://rxlib.ru/Stat/shevelev/shev.htm
или
http://www.cyberguru.ru/programming/win32/win32-hooks.html
Только тебе не нужно перехватывать, что-либо (мышь, клаву и т.д.), тебе нужно чтобы dll подгрузилась в адресное пространство целевого процесса, для этого достаточно установить ловушку:

 
Код:
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
...
TESTDLL_API void InstallHook(DWORD dwThreadId)
{
    hHook = SetWindowsHookEx( WH_CBT, (HOOKPROC)HookProc, hDLL, dwThreadId );
}

а процедуре делать ничего не обязательно, она просто должна вызвать следующий(если есть) хук в цепочке:
 
Код:
TESTDLL_API LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    return CallNextHookEx( hHook, nCode, wParam, lParam);
}
490
23 октября 2007 года
frid-karatel
357 / / 15.09.2007
а если использовать такой вариант?
DLL
Код:
#include <windows.h>
#include <vcl.h>
#include "CGAUGES.h"

#pragma argsused

// этими объектами можно управлять, как своими
// при изменении свойств объектов могут возникнуть проблемы с синхронизацией
// при чтении должно быть все нормально
TForm *MainForm=NULL;
TCGauge *CGauge1=NULL;

void Init()
{
  TForm **pForm=(TForm**)GetProcAddress(GetModuleHandle(NULL), "_MainForm");
  if(pForm==NULL)
  {
    /* ERROR: export not found */
  }
  else
  {
    MainForm=*pForm;
    if(MainForm==NULL)
    {
      /* ERROR: form is not accessible */
    }
    else
    {
      CGauge1=(TCGauge*)MainForm->FindComponent("CGauge1");
      if(CGauge1==NULL)
      {
        /* ERROR: CGauge not found */
      }
      else
      {
        CGauge1->Progress=50;  // for test
      }
    }
  }
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH:
        Init();
        break;
    }

    return 1;

}


программа-стартер
Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

HMODULE hRemoteModule=NULL;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;

  bool bSuccess=false;

  memset(&si, 0, sizeof(si));
  si.cb=sizeof(si);

  if(!CreateProcess(NULL, "..\\__test2\\project1.exe", 0, 0, FALSE, 0, 0, 0, &si, &pi))
  {
    ShowMessage(SysErrorMessage(GetLastError()));
  }
  else
  {
    DWORD res=WaitForInputIdle(pi.hProcess, 10000);    // 10 secs
    if(res==WAIT_TIMEOUT)
    {
      if(MessageBoxA(Handle, "Превышен предел ожидания. Уничтожить процесс?", 0, MB_YESNO | 16)==IDYES)
        TerminateProcess(pi.hProcess, 0);
    }
    else
    {
      String DllPath=ExtractFilePath(ExcludeTrailingBackslash(ExtractFilePath(Application->ExeName)));
      DllPath+="\\__test1\\project2.dll";
      LPVOID p=VirtualAllocEx(pi.hProcess, 0, DllPath.Length()+1, MEM_COMMIT, PAGE_READWRITE);
      if(!p)
      {
        ShowMessage("Can't Write Memory To Process: "+SysErrorMessage(GetLastError()));
      }
      else
      {
        if(!WriteProcessMemory(pi.hProcess, p, DllPath.c_str(), DllPath.Length()+1, NULL))
        {
           ShowMessage("Can't write to process memory");
        }
        else
        {
          FARPROC fp=GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
          if(!fp)
          {
            ShowMessage("Can't get address of kernel32.dll!LoadLibraryA");
          }
          else
          {
            HANDLE hThread=CreateRemoteThread(pi.hProcess, 0, 0, (LPTHREAD_START_ROUTINE)fp, (LPVOID)p, 0, NULL);
            if(!hThread)
            {
              ShowMessage("Can't create remote thread: "+SysErrorMessage(GetLastError()));
            }
            else
            {
              res=WaitForSingleObject(hThread, 10000);  // wait 10 secs

              if(res==WAIT_TIMEOUT)
              {
                if(MessageBoxA(Handle, "Поток завис. Завершить его?", 0, 16 | MB_YESNO)==IDYES)
                {
                  TerminateThread(hThread, 0);
                }
              }

              GetExitCodeThread(hThread, (LPDWORD)&hRemoteModule);
              if(hRemoteModule) bSuccess=true;
              else ShowMessage("Инициализация DLL в удалённом процессе завершена с ошибкой");
              CloseHandle(hThread);
            }  // hThread
          } // (!fp)
        } // write process memory
        VirtualFreeEx(pi.hProcess, p, DllPath.Length()+1, MEM_FREE);
      }  // virtual alloc
    }  // WaitForInputIdle(...) == WAIT_TIMEOUT

    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
  } // CreateProcess

  if(bSuccess) ShowMessage("Операция успешно завершена :)");

}


Что делаем: запускаем программу-стартер, нажимаем на кнопку - запускаем ПСР (программу стороннего разработчика) и пытаемся подключить библиотеку к этой программе, далее при успешном подключении изменяем положение TCGauge...

что тут не так и можно ли такое использовать? какие есть замечания или пожелания?

дело в чем - а вот не получается получить сообщение "Операция успешно завершена"... :( Выходит только "Инициализация DLL в удалённом процессе завершена с ошибкой"
246
23 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
а если использовать такой вариант?


да на здоровье, только внедрение с помощью удаленного потока не будет работать под Win9х. Хотя в этом случае удобно контроллировать запуск программы(китайской). Ну тут тебе решать.

Цитата: frid-karatel

...
// этими объектами можно управлять, как своими
// при изменении свойств объектов могут возникнуть проблемы с синхронизацией
// при чтении должно быть все нормально


а вот это интересное утверждение, это ты сам придумал или где-то представленный код подрезал? (просто такой уверенный комментарий, если у тебя не получилось, то откуда такая уверенность:))
и к _MainForm из каких соображений обращаемся?

Цитата: frid-karatel

Что делаем: запускаем программу-стартер, нажимаем на кнопку - запускаем ПСР (программу стороннего разработчика) и пытаемся подключить библиотеку к этой программе, далее при успешном подключении изменяем положение TCGauge...


ну это все понятно, только код я не стал проверять (пишешь не удобоваримо:), я привык к "к классикам" типа Рихтера)

Цитата: frid-karatel

что тут не так и можно ли такое использовать? какие есть замечания или пожелания?


можно-ли использовать - хз:(
пожелание - научись внедрять dll в "китайский" процесс, тогда скажу что делать дальше (есть одна идейка, но сформулировать пока не могу, надо переварить маленько)

490
23 октября 2007 года
frid-karatel
357 / / 15.09.2007
внедрил в ПСР эту DLL - все работает - значение TCGauge меняется, как я захочу - класс...

Цитата:
интересное утверждение, это ты сам придумал или где-то представленный код подрезал? (просто такой уверенный комментарий


код мне подкинули... подсказали, верней, и комментарии - тоже их... так что авторские права принадлежат не мне :)

Цитата:
к _MainForm из каких соображений обращаемся


Я получил таблицу экспорта, а форма эта фактически является главной формой всей ПСР...

Цитата:
внедрение с помощью удаленного потока не будет работать под Win9х


А кто сейчас на Win 9x работает? :)

По началу не получилось из-за строки:
String DllPath=ExtractFilePath(ExcludeTrailingBackslash(ExtractFilePath(Application->ExeName)));
я ее не стал урезать, думал, что это перевод в какой-то специализированный формат пути, оказалось, что просто обрезание последнего каталога... :)

Идейка... мне нужны идейки :)

246
23 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
внедрил в ПСР эту DLL - все работает - значение TCGauge меняется, как я захочу - класс...


Респект и уважуха! Добил китайцев!

Цитата: frid-karatel

код мне подкинули... подсказали, верней, и комментарии - тоже их... так что авторские права принадлежат не мне :)


где, кто - тоже хочу с умными пацанами пообщаться

Цитата: frid-karatel

Я получил таблицу экспорта, а форма эта фактически является главной формой всей ПСР...


вообщем-то так и подумал, хотел еще предложить тебе дамп снять с "китайца"(правда немного другое интересовало). Не универсально получается, но главное работает (а вообще никто не мешает таблицу экспорта программно получать:))

Цитата: frid-karatel

А кто сейчас на Win 9x работает? :)


есть отморозки...

Цитата: frid-karatel

Идейка... мне нужны идейки :)


Ну а идейка такая, вот заинтересовал ты меня вчера своим вопросом ну я и создал тестовый пример, нагрузил туда контролов, состряпал dll-ку и "инжектор" и попыталься зацепить Application в тестовой программе(и через хук и через удаленный поток). Получилось не очень, говорит, что только св-ва Tag и Name есть у него (но это же фигня полная). Ну я взял и подгрузил на старте dll-ки пакетик и чудо произошло видит все и не падает, а вот объяснить не могу зачем так сделал. Что-то с инициализацией пакета связано очевидно т.е. надо подумать еще.

490
23 октября 2007 года
frid-karatel
357 / / 15.09.2007
так, теперь необходимо не установить какие-либо параметры контролов, а получить при обновлении... какие здесь будут варианты? создать TTimer, который будет через определенное время посылать команды МП или создать TApplicationEvent, который будет перехватывать все сообщения? может есть еще что сделать можно?

PS: чувствую, что конец уже не за горами - и тема будет разобрана полностью :)
246
23 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
так, теперь необходимо не установить какие-либо параметры контролов, а получить при обновлении... какие здесь будут варианты? создать TTimer, который будет через определенное время посылать команды МП или создать TApplicationEvent, который будет перехватывать все сообщения? может есть еще что сделать можно?

PS: чувствую, что конец уже не за горами - и тема будет разобрана полностью :)


Сабклассим компоненты, форму или просто присваиваем свой обработчик нужного события, а результат шлем контроллирующему приложению чере WM_COPYDATA (или через МАП-файл + событие оповещения)
см. FAQ http://forum.codenet.ru/showthread.php?t=26390
Вопросы № 2, 27

490
24 октября 2007 года
frid-karatel
357 / / 15.09.2007
прочитал по тем ссылкам - наверное я дурак :) не понимаю, что надо написать в DLL...

получается, надо написать свою функцию MyFunc(), которую потом передать в обработчик компонента на форме? А как узать, в какой компонент? а если обновление TCGauge происходит вне обработки, например, нажатия, а во время выполения какой-либо функции, например __void fastcall SetGaugePos(int gPos)?

а почему TTimer нельзя воспользоваться? глупо?

PS: прошу "разжувать" - что делать дальше? :)
246
24 октября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: frid-karatel
прочитал по тем ссылкам - наверное я дурак :) не понимаю, что надо написать в DLL...

получается, надо написать свою функцию MyFunc(), которую потом передать в обработчик компонента на форме? А как узать, в какой компонент? а если обновление TCGauge происходит вне обработки, например, нажатия, а во время выполения какой-либо функции, например __void fastcall SetGaugePos(int gPos)?

а почему TTimer нельзя воспользоваться? глупо?

PS: прошу "разжувать" - что делать дальше? :)



Да придется использовать таймер или поток для опроса т.к. у TCGauge не событий вообще.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог