この質問に対する最も一般的な回答のコードを使用しようとしています: 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 以外のものを含める必要がありますか?