Votre application se bloque? Il y a quelque chose qui ne va pas dans votre application. Habituellement, il y aura un AV simple. Une AV entraîne un message d'erreur. C'est tout.
BTW, vous ne devriez pas avoir peur de - il suffit de le gérer.
function IsValidObject(const AObj: Pointer { or TObject}): Boolean;
begin
try
...
// place your checking code there
Result := ...;
except
on EAccessViolation do
Result := False;
end;
end;
La seule exception à cette règle qui vient à l'esprit est si vous écrivez une sorte de gestionnaire d'exceptions et que vous voulez détecter s'il y a un objet valide. Dans ce cas, vous ne voulez probablement pas générer une exception dans le gestionnaire d'exception;)
Si tel est votre cas - essayez d'utiliser ce code (ceci est un exemple):
function GetReadableSize(const AAddress: Pointer; const ASize: Cardinal): Cardinal;
const
ReadAttributes = [PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE];
var
MemInfo: TMemoryBasicInformation;
Tmp: Cardinal;
begin
Result := 0;
if (VirtualQuery(AAddress, MemInfo, SizeOf(MemInfo)) = SizeOf(MemInfo)) and
(MemInfo.State = MEM_COMMIT) and (MemInfo.Protect in ReadAttributes) then
begin
Result := (MemInfo.RegionSize - (Cardinal(AAddress) - Cardinal(MemInfo.BaseAddress)));
if Result < ASize then
begin
repeat
Tmp := GetReadableSize(Pointer(DWord(MemInfo.BaseAddress) + MemInfo.RegionSize), (ASize - Result));
if (Tmp > 0) then
Inc(Result, Tmp)
else
Result := 0;
until (Result >= ASize) or (Tmp = 0);
end;
end;
end;
function IsValidBlockAddr(const AAddress: Pointer; const ASize: Cardinal): Boolean;
begin
Result := (GetReadableSize(AAddress, ASize) >= ASize);
end;
Mais généralement, vous devriez préférer la première approche.
Je sens dans votre code de nombreux pointeurs. Les pointeurs sont le chemin vers le côté obscur. Les pointeurs mènent à des violations d'accès, les violations d'accès entraînent des pannes de programme et les plantages de programmes entraînent des clients mécontents. –
Salut! Je n'utilise pas souvent de pointeurs très souvent (en Delphi au moins). Mais dans ce cas, je voulais détecter si une pièce de 4 octets d'un objet est une référence d'objet - et pour cela je dois descendre au niveau du pointeur ... – jpfollenius