1

この質問に対する最も一般的な回答のコードを使用しようとしています: C# を使用して、ファイルをロックしているプロセスをどのように把握しますか?

VS2010 と .NET v4 を使用して、Windows 7 x64 でこのコードをテストしています。

コードの抜粋...

var baTemp = new byte[nLength];
try
{
    Marshal.Copy(ipTemp, baTemp, 0, nLength);
    strObjectName = Marshal.PtrToStringUni(Is64Bits() ? new IntPtr(ipTemp.ToInt64()) : new IntPtr(ipTemp.ToInt32()));
}
catch (AccessViolationException)
{
    return null;
}
finally
{
    Marshal.FreeHGlobal(ipObjectName);
    Win32API.CloseHandle(ipHandle);
}

私の問題を引き起こしているものです。以前に作成されたアドレスが有効でない場合、Marshal.Copy は失敗する可能性があります。x64 システムでアドレスを作成するコード...

if (Is64Bits())
{
    ipTemp = new IntPtr(Convert.ToInt64(objObjectName.Name.Buffer.ToString(), 10) >> 32);
}

私が指摘した失敗の 1 つの例では、x1C92AA2089E00000 に変換される 20588995036390572032 のバッファ文字列表現で始まります。このコードは、使用可能なアドレスとして x1C92AA20 を残して下位ワードを取り除いているように見えます。

質問 1: 64 ビット OS で実行されている 64 ビット アプリで、下位ワードをシフト アウトして上位ワードだけを使用するのではなく、バッファ オブジェクトによって提供される 64 ビット アドレスを単純に使用しないのはなぜですか?

質問 2: try/catch/finally ブロックには、AccessViolationException 以外のものを含める必要がありますか?

4

1 に答える 1