Как получить доступ к перекрестному процессу vcl info, как перечислить информацию о дочернем элементе управления vcl?
Здесь я пытаюсь переписать метод VCL FindControl()(Borland C++ Builder),потому что исходная функция FindControl не поддерживает кросс-процессный доступ. По чьей - то ссылке я написал следующий код
TWinControl* FindControlEh(HWND hwnd); extern "C" __declspec(dllexport) HWND __stdcall FindControls(HWND hwnd , char* ctrl_name); TAtom ControlAtom; char ControlAtomString[512]; DWORD RM_GetObjectInstance; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { printf("Load FindControl.dll."); switch(fwdreason) { case DLL_PROCESS_ATTACH: { ControlAtom = GlobalAddAtom(ControlAtomString); sprintf(ControlAtomString,"ControlOfs%08X%08X",GetModuleHandle(NULL), GetCurrentThreadId()); RM_GetObjectInstance = RegisterWindowMessage(ControlAtomString); } break; case DLL_PROCESS_DETACH: GlobalDeleteAtom(ControlAtom); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return 1; } //--------------------------------------------------------------------------- HWND __stdcall FindControls(HWND hwnd , char* ctrl_name) { int index = 0; TWinControl* main_controls = FindControlEh(hwnd); int ctrls_count = main_controls->ControlCount; UnicodeString ctrl_name_unicode(ctrl_name); ShowMessage(IntToStr(ctrls_count)); TWinControl* tmp_control; for(index = 0; index (main_controls->Controls[index]); if(ctrl_name_unicode == tmp_control->GetNamePath()) { //ShowMessage("Find the control" + ctrl_name_unicode); return tmp_control->Handle; } } return NULL; } TWinControl* FindControlEh(HWND hwnd) { DWORD OwningProcess; DWORD hwnd_threadid; TWinControl* result = NULL; hwnd_threadid = GetWindowThreadProcessId(hwnd , &OwningProcess); if( hwnd != NULL && 0 != hwnd_threadid && OwningProcess == GetCurrentProcessId()) { if(GlobalFindAtom(ControlAtomString) == ControlAtom) { result = (TWinControl*)Pointer(GetProp(hwnd , MakeIntAtomA(PChar(ControlAtom)))); } else result = (TWinControl*)Pointer(SendMessage(hwnd , RM_GetObjectInstance , 0 , 0)); } return result; }
Что я уже пробовал:
Я отлаживаю
FindControlEhметод , результат всегда возвращает null.
вот что я делаю:
1.я не очень хорошо разбираюсь в vcl. Многие элементы управления vcl не являются стандартными элементами управления win32. Свойство элемента управления VCL, включая такую вещь, как имя элемента управления, которое недоступно.Поэтому я использую Borland C++ Builder IDE для написания некоторых методов в виде интерфейса(DLL), чтобы раскрыть некоторые свойства элементов управления vcl. Я не очень хорошо знаю о Borland C++ Builder Env. открытые интерфейсы в dll будут вызываться в VSC++ env;
2.я пытаюсь получить доступ ко всем элементам управления какой-то другой программы, разработанной Borland C++ Builder IDE.cross process. Исходная функция VCL не поддерживает кросс-процессный доступ.
FindControl
Поэтому я написал еще одну функцию,надеясь получить доступ к перекрестному процессу управления vcl
FindControlEh
Это не работает.Я не знаю, что случилось. дай мне руку, пожалуйста.