Yount_0701 Ответов: 0

Как получить доступ к перекрестному процессу 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

Это не работает.Я не знаю, что случилось. дай мне руку, пожалуйста.

0 Ответов