VCL рдореЗрдВ рдкрд░рдорд╛рдгреБрдУрдВ рдФрд░ рд╕реВрдХреНрд╖реНрдо рдмрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ

рдЫрд╡рд┐

рдмрдЧ рдЦреЛрдЬ


рдореБрдЭреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рдФрд░ рдЧрд╣рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдбреЗрд▓реНрдлрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреЗ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреАрдбрд╝рд╛ рд╣реБрдИ рдереАред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛, рдмрдЯрди рджрдмрд╛рдП рдЧрдП, рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░реЛрдВ рдиреЗ рдзреНрдпрд╛рди рдЦреЛрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдФрд░ рд╕рдм рдХреБрдЫ рдЙрджрд╛рд╕ рдерд╛, рдФрд░ рдЖрдИрдбреАрдИ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдИрдбреАрдИ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрд╡рдпрдВ рднреА рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд▓рдЧрд╛ред рдореБрдЭреЗ рд░рд┐рдмреВрдЯ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдЖрдЬ рдЗрд╕рдиреЗ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ рдЙрд╕рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреАред рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖред
рд╡рд┐рдВрдбреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЧрд┐рд░рд╡реА рд░рдЦрдХрд░, рдореИрдВрдиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ Control.pas рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ:
function FindControl(Handle: HWnd): TWinControl; var OwningProcess: DWORD; begin Result := nil; if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and (OwningProcess = GetCurrentProcessId) then begin if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom))) else Result := ObjectFromHWnd(Handle); end; end; 

рдФрд░ GetProp (рд╣реИрдВрдбрд▓, MakeIntAtom (ControlAtom)) рд╣рдореЗрд╢рд╛ 0 рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ ControlAtom рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ 0 рд╣реИ, рдФрд░ GlobalFindAtom (PChar (ControlAtomString)) рднреА 0 рджреЗрддрд╛ рд╣реИред
ControlAtomString рдФрд░ ControlAtom рдХреЛ InitControls рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
 procedure InitControls; var UserHandle: HMODULE; begin {$IF NOT DEFINED(CLR)} WindowAtomString := Format('Delphi%.8X',[GetCurrentProcessID]); WindowAtom := GlobalAddAtom(PChar(WindowAtomString)); ControlAtomString := Format('ControlOfs%.8X%.8X', [HInstance, GetCurrentThreadID]); ControlAtom := GlobalAddAtom(PChar(ControlAtomString)); RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString)); {$IFEND} 

ControlAtomString рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЖрдмрд╛рдж рд╣реИ, рд▓реЗрдХрд┐рди ControlAtom рд╢реВрдиреНрдп рд╕реЗ рдЖрдмрд╛рдж рд╣реИред рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдХреЛрдИ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдпрд╛, рдЕрдлрд╕реЛрд╕ред рдпрджрд┐ рдЖрдк GlobalAddAtom рдХреЗ рдмрд╛рдж GetLastError рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдпрд╣ ERROR_NOT_ENOUGH_MEMORY рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдФрд░ рдпрджрд┐ рдЖрдк рдЕрднреА рднреА MSDN рдкрд░ GlobalAddAtom рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рдорд╛рдгреБ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдП рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред GlobalAddAtom рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, GlobalDeleteAtom рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред


рд╕рдм рдХреБрдЫ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡реЗрджрди рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рдорд╛рдгреБ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдФрд░ рдмрд┐рд▓реНрд▓реА рдирд╛рдорд┐рдд рдкрд░рдорд╛рдгреБрдУрдВ рдХреЗ рд▓рд┐рдП рд░реЛрддреА рд╣реИ: 0xC000-0xFFFF, рдЕрд░реНрдерд╛рдд, рдХреЗрд╡рд▓ 16383ред рдпрд╣реА рд╣реИ рдкреНрд░рддреНрдпреЗрдХ dll, рдФрд░ рдбреЗрд▓реНрдлреА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ exe-shnik рдиреЗ рдЧрд▓рдд рдкреВрд░реНрдг рдкрддреНрддрд┐рдпреЛрдВ рдкрд░ VCL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рдорд╛рдгреБрдУрдВ рдХреЛ рд▓реАрдХ рдХрд┐рдпрд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП - рдлрд┐рд░ рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг 2-3 рдкрд░рдорд╛рдгреБ:
Controls.tom рдФрд░ Controls.pas рдореЗрдВ WindowAtom рдФрд░ рдбрд╛рдпрд▓реЙрдЧрд╕реНрдкреЗрд╕ рдореЗрдВ WndProcPtrAtom

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓


рдирд┐рд░реНрдорд┐рдд рдкрд░рдорд╛рдгреБ рджреЗрдЦреЗрдВ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░рдорд╛рдгреБрдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 program EnumAtomsSample; {$APPTYPE CONSOLE} uses Windows, SysUtils; function GetAtomName(nAtom: TAtom): string; var n: Integer; tmpstr: array [0..255] of Char; begin n := GlobalGetAtomName(nAtom, PChar(@tmpstr[0]), 256); if n = 0 then Result := '' else Result := tmpstr; end; procedure EnumAtoms; var i: Integer; s: string; begin for i := MAXINTATOM to MAXWORD do begin s := GetAtomName(i); if (s <> '') then WriteLn(s); end; end; begin try EnumAtoms; ReadLn; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. 

рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рдорд╛рдгреБ рдХрд┐рд╕реА рд╡реАрд╕реАрдПрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдХреЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЪреВрдБрдХрд┐ рдкрд░рдорд╛рдгреБ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рд╣рдо рдЙрдирдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕реАрдЦрддрд╛ рд╣реИ рдХрд┐ рдкрд░рдорд╛рдгреБ рд▓реАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдкрд░рдорд╛рдгреБрдУрдВ рдХреЗ рдирд╛рдо рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП
WndProcPtrAtom WndProcPtr [HInstance] [рдереНрд░реЗрдбрд┐рдб] рд╣реИ
ControlAtom ControlOfs [HInstance] [рдереНрд░реЗрдбрд┐рдб] рд╣реИ
WindowAtom рдбреЗрд▓реНрдлреА рд╣реИ [ProcessID]
рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рдорд╛рдгреБ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдбреЗрд▓реНрдлреА рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╕рд░реНрдЧ + рдПрдХ рдпрд╛ рджреЛ 32-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╛ рддреЛ ProcessID рдпрд╛ ThreadID HEX рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдзрд╛рдЧрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реАрдХ рдкрд░рдорд╛рдгреБ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдБ рд╣рд╛рдБ, рдПрдХ рдореМрдХрд╛ рд▓реЗ рд▓реЛред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдЗрд╕ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдХреЛрдИ рдереНрд░реЗрдб / рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкрд░рдорд╛рдгреБ рдХреЛ рд╣рдЯрд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ рдФрд░ рдбреЗрд▓реНрдлреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рдФрд░ рд╡рд┐рд▓реЛрдкрди рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд░рдорд╛рдгреБ рдХреЛ рд╡реИрдз рдЖрд╡реЗрджрди рд╕реЗ рд╣рд░рд╛ рджреЗрдВрдЧреЗред рд╕реНрдерд┐рддрд┐ рдЕрддреНрдпрдВрдд рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЪреЗрдХ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ, рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдбреЗрд▓реНрдлрд╝рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд╣рдореЗрд╢рд╛ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╣реА рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рдорд╛рдгреБрдУрдВ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдбреНрд╕ (рд╡реАрд╕реАрдПрд▓ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛) рдирд╣реАрдВ рджрд┐рдЦрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдРрд╕реЗ рд▓реАрдХ рд╣реБрдП рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рдорд╛рдгреБрдУрдВ рдХреА рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрд╕реЛрд▓ рдЯреВрд▓ рд▓рд┐рдЦрд╛ред
рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 program AtomCleaner; {$APPTYPE CONSOLE} uses Windows, SysUtils; const THREAD_QUERY_INFORMATION = $0040; function OpenThread(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall; external kernel32; function ThreadExists(const ThreadID: Cardinal): Boolean; var h: THandle; begin h := OpenThread(THREAD_QUERY_INFORMATION, False, ThreadID); if h = 0 then begin Result := False; end else begin Result := True; CloseHandle(h); end; end; function TryHexChar(c: Char; out b: Byte): Boolean; begin Result := True; case c of '0'..'9': b := Byte(c) - Byte('0'); 'a'..'f': b := (Byte(c) - Byte('a')) + 10; 'A'..'F': b := (Byte(c) - Byte('A')) + 10; else Result := False; end; end; function TryHexToInt(const s: string; out value: Cardinal): Boolean; var i: Integer; chval: Byte; begin Result := True; value := 0; for i := 1 to Length(s) do begin if not TryHexChar(s[i], chval) then begin Result := False; Exit; end; value := value shl 4; value := value + chval; end; end; function GetAtomName(nAtom: TAtom): string; var n: Integer; tmpstr: array [0..255] of Char; begin n := GlobalGetAtomName(nAtom, PChar(@tmpstr[0]), 256); if n = 0 then Result := '' else Result := tmpstr; end; function CloseAtom(nAtom: TAtom): Boolean; var n: Integer; s: string; begin Result := False; s := GetAtomName(nAtom); if s = '' then Exit; WriteLn('Closing atom: ', IntToHex(nAtom, 4), ' ', s); GlobalDeleteAtom(nAtom); Result := True; end; function ProcessAtom(nAtom: TAtom): Boolean; var s: string; n: Integer; id: Cardinal; begin Result := False; s := GetAtomName(nAtom); n := Pos('ControlOfs', s); if n = 1 then begin Delete(s, 1, Length('ControlOfs')); if Length(s) <> 16 then Exit; Delete(s, 1, 8); if not TryHexToInt(s, id) then Exit; if not ThreadExists(id) then Exit(CloseAtom(nAtom)); Exit; end; n := Pos('WndProcPtr', s); if n = 1 then begin Delete(s, 1, Length('WndProcPtr')); if Length(s) <> 16 then Exit; Delete(s, 1, 8); if not TryHexToInt(s, id) then Exit; if not ThreadExists(id) then Exit(CloseAtom(nAtom)); Exit; end; n := Pos('Delphi', s); if n = 1 then begin Delete(s, 1, Length('Delphi')); if Length(s) <> 8 then Exit; if not TryHexToInt(s, id) then Exit; if GetProcessVersion(id) = 0 then if GetLastError = ERROR_INVALID_PARAMETER then Exit(CloseAtom(nAtom)); Exit; end; end; procedure EnumAndCloseAtoms; var i: Integer; begin i := MAXINTATOM; while i <= MAXWORD do begin if not ProcessAtom(i) then Inc(i); end; end; begin try EnumAndCloseAtoms; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. 


рдмрд╕ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рд▓реАрдХ рд╣реБрдП рдкрд░рдорд╛рдгреБрдУрдВ рдХреЛ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рдЖрдк рдкрд╣рд▓реЗ рд╣реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрд░рдорд╛рдгреБрдУрдВ рдХреЛ рд▓реАрдХ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


рдХреЛрдб рдХреЗ рдирд┐рд░реАрдХреНрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрди рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рдорд╛рдгреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕реЗрдЯрдкреНрд░реЙрдк рдФрд░ рдЧреЗрдЯрдкреНрд░реЙрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдХрд┐ рдбреЗрд▓реНрдлреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдкрд░рдорд╛рдгреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпреЗ рджреЛрдиреЛрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧрд░реНрд╕ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рдорд╛рдгреБ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡реАрд╕реАрдПрд▓ рдХреЛрдб рдореЗрдВ рдРрд╕реА рддреБрд▓рдирд╛рдУрдВ рдХрд╛ рддрд░реНрдХ рднреА рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ:
рдЕрдЧрд░ GlobalFindAtom (PChar (ControlAtomString)) = ControlAtom
рджреЛрдиреЛрдВ рдЪрд░ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдЖрд░рдореНрднрд┐рдХ рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ (HInstance and ThreadID рд╕реЗ)ред рд╕рддреНрдпрд╛рдкрди рд╣рдореЗрд╢рд╛ рд╕рдЪ рд▓реМрдЯреЗрдЧрд╛ред рдХрд╛рд╢, рдбреЗрд▓реНрдлреА рдЕрдм рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд░рд╣реА рд╣реИ, рд╕рднреА рддрд░рд╣ рдХреЗ FMXsред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ QC рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рднреА рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдареАрдХ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЯреВрд▓ рдХреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╣рд░ рддрд░рд╣ рд╕реЗ рд▓реАрдХ рдкрд░рдорд╛рдгреБрдУрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред
рдЦреИрд░, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ, рд╣рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рдорд╛рдгреБрдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдУрдПрд╕ рдЙрдирдХреЗ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдХрд░рдг + рд╕реНрд░реЛрдд

Source: https://habr.com/ru/post/In217189/


All Articles