在只知道FORM 的HANDLE 的前提下,如何取得该FORM 的指针(40分)

  • 主题发起人 主题发起人 Allen
  • 开始时间 开始时间
使用 Controls.pas 中的 FindControl 函数,再将返回的 TWinControl 转换成 TForm
对象。
 
但是如果这个FORM 在别的进程中,则FINDCONTROL 返回NIL,这种情况又该如何
 
根据 FindControl 的原理,写了个函数:
function FindControlEx(Handle: HWnd): TWinControl;
var
ControlAtom: TAtom;
AtomText: array[0..31] of Char;
begin
Result := nil;
if Handle = 0 then Exit;
ControlAtom := GlobalFindAtom(
StrFmt(AtomText, 'ControlOfs%.8X%.8X',
[GetWindowLong(Handle, GWL_HINSTANCE),
GetWindowThreadPRocessID(Handle, nil)]));
if ControlAtom <> 0 then
begin
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)));
end;
end;
但是,这个函数没有很大用处,因为它返回的实际是指向 WinControl 所占用内存块的指针
,当这个Wincontrol 在其它进程中时,由于各进程地址空间是相互独立的,该指针只对
那个 Wincontrol 所在进程有效。你直接用这个指针时,你实际上访问的还是你自己进程中
的地址空间,由于这个指针对于你自己的进程并没有意义,就会引起异常。
 
15天之内如果没有人再回答,将结束此问题并给BBKXYJ 加分。
 
接受答案了.
 
后退
顶部