Получение формы FMX из HWND одного exe и встраивание его в форму другого exe - PullRequest
0 голосов
/ 18 июня 2020

У меня два EXE, exe1 и exe2. Они действуют как клиент и сервер, связанные через TCP. В exe 1 есть кнопка «Объединить». При нажатии на нее получается дескриптор формы в exe 2, который регистрируется как int в файле.

// resp is object holding the handle value as wstring

long whnd = _wtoi(resp->GetValue("handle")->Value().c_str());  // converted from string to long

// Getting form object of exe2 from handle
TCommonCustomForm  *wd = Fmx::Platform::Win::FindWindow((HWND)whnd);

// wd  = NULL

Но это возвращает nullptr ? Есть идеи, почему.

Как получить форму из exe2 через HWND и объединить ее с формой exe1?

1 Ответ

0 голосов
/ 23 июня 2020

Функция Fmx::Platform::Win::FindWindow() принимает Win32 HWND в качестве входных данных и возвращает объект FMX Form, которому принадлежит HWND. Хотя HWND является глобальным ресурсом и может быть доступен через границы процесса, каждый процесс имеет собственное адресное пространство памяти, и к объектам в каждом процессе нельзя напрямую получить доступ через границы процессов. Это означает, что HWND, который вы передаете в FindWindow(), должен принадлежать форме, которая существует в том же процессе, который вызывает FindWindow(), что не так в вашей ситуации, поэтому FindWindow() возвращает nullptr.

Таким образом, вы не сможете объединить свои пользовательские интерфейсы вместе на уровне FMX, вы сможете сделать это только на уровне Win32 API, используя функцию Win32 SetParent() . Чего вам вообще не следует делать за границами процессов , поскольку FMX не предназначен для совместного использования его windows между процессами.

Фактически, это даже невозможно, потому что Панель FMX не имеет собственного HWND, в отличие от панели VCL. Все дочерние элементы управления в FMX не имеют окон! Только формы имеют HWND s, поскольку они являются единственным элементом пользовательского интерфейса, который напрямую взаимодействует с ОС. Все дочерние элементы управления в FMX настраиваются FMX. Отношениями родитель / потомок управляет только FMX, а не ОС.

...