アプリケーションがハングアップしますか?アプリケーションに何か問題があります。 通常、単純なAVがあります。 AVによりエラーメッセージが表示されます。それだけです。
ところで、あなたはそれを恐れてはいけません。ただそれを処理してください。
function IsValidObject(const AObj: Pointer { or TObject}): Boolean;
begin
try
...
// place your checking code there
Result := ...;
except
on EAccessViolation do
Result := False;
end;
end;
このルールの例外は、何らかの例外ハンドラを作成していて、有効なオブジェクトがあるかどうかを検出したい場合です。
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;
しかし通常: - )
これはあなたのケースであれば、(これは一例です)このコードを使用しようと、あなたはおそらく例外のハンドラで例外を発生させたくないという場合にはあなたは最初のアプローチを好むべきです。
私はあなたのコードで多くのポインタを感じます。ポインタは、暗い側へのパスです。ポインタがアクセス違反につながり、アクセス違反がプログラムのクラッシュにつながり、プログラムのクラッシュが不幸な顧客につながります。 –
こんにちは!私は通常、ポインタを非常に頻繁に使用しません(Delphiでは少なくとも)。しかし、この場合、オブジェクトの4バイト部分がオブジェクト参照であるかどうかを検出したいと思っていました。そのためにポインタレベルまで下がっていく必要があります... – jpfollenius