2015-01-18 9 views
1

내가 그들을 더 안전 할 IntPtr입니다 작업에 사용하고, 클래스이다SafeHandleZeroOrMinusOneIsInvalid 또는 SafeHandle을 올바르게 해제하는 방법? 내가 여기에 몇 가지 문서를 읽기 및

internal class MySafeHandleOperator : SafeHandleZeroOrMinusOneIsInvalid 
{ 
    public MySafeHandleOperator(IntPtr handle) : base(true) 
    { 
     SetHandle(handle); 
    } 

    public IntPtr GetPtr() 
    { 
     return this.handle; 
    } 

    protected override bool ReleaseHandle() 
    { 
     this.Dispose(true); 
     return true; 
    } 
} 

주요 질문은 ReleaseHandle 방법입니다. 나는 그런 식으로 사용했지만 이것이 올바른 사용법이라면 나는 분발되었다. 핸들을 해제하고이 클래스를 지우는 또 다른 올바른 방법이있을 수 있습니까?

내가 (간단한 예제)와 유사하게이 클래스를 사용하고 싶습니다 : 내가 바로 모든 일을 해요 경우 누군가를 살펴보고 말을하면

Process p = Process.Start(processName); 
MySafeHandleOperator mh = new MySafeHandleOperator(p.MainWindowHandle); 

가 감사 할 것인가 또는이 메서드를 다시 작성해야합니다.

+0

괜찮습니다, 예를 들어, ['CloseHandle'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724211 (v = vs.85) .aspx). 'HWND'는 그런 종류의 핸들이 아닙니다. 세이프티 클래스에서 상속하여 패스 할 필요는 없습니다. 그 종류의 핸들이라면,'ReleaseHandle'에서'CloseHandle (this.handle)'을 호출 할 것입니다. 거기에서 물건을 처분하지 마십시오. – GSerg

답변

4

아니요, 좋지 않습니다. SafeHandle의 포인트는 네이티브 코드에 핸들을 전달하는 동안 클래스 객체가 파괴되지 않도록하는 것입니다. 그게 심술 궂을 수있어, 파이널 라이저가 불려가, 네이티브 코드가 무효 인 핸들을 사용해 계속됩니다. 발생할 수있는 런타임 오류 및 손상 이외에도이 기능을 사용하여 재사용 공격 시나리오를 처리하는 것은 매우 위험합니다.

그러나 해당 창 핸들의 수명을 완전히 제어 할 수는 없습니다. 당신은 파괴되는 것을 막을 수 없으며, 당신 스스로 그것을 파괴하기위한 어떠한 것도 할 수 없습니다. 음, finalizer를 가진 프로세스를 죽이지 않을 것이라고 가정하십시오. ReleaseHandle()에 대한 유용한 재정의 (override)를 가지지 않음으로써 당신이 알아낼 수있는 것. 실용적인 파생 클래스의 예로는 SafeFileHandle class을 사용하십시오. .NET Framework에는 많은 것들이 있습니다. 좋은 디 컴파일러는이를 찾는 훌륭한 방법입니다. 그것을 포장 아무 소용이 없기 때문에

길고도 짧은 이야기, IntPtr입니다 당신이 제대로 닫혀 있는지 핸들을 만들기 위해 SafeHandleZeroOrMinusOneIsInvalid``에서 상속

+0

그래서, 이해하는 한,이 클래스를 사용하여 간단한 창 리소스로 IntPtr을 반환 할 필요가 없습니다. 그것을 사용하는 유일한 합리적인 방법은 내가 스스로 제어하는 ​​자원을 가지고있는 것입니다. – Oleksii

+1

그 코드는 실제로 http://blog.benoitblanchon.fr/safehandle/에 의해 영감을 받았습니다. 관리되지 않는 기능을 호출하는 동안이 코드와이 코드의 차이점은 무엇입니까? – Oleksii

+1

질문에 답했다. 그는 유용한 ReleaseHandle() 오버라이드를 가지고있다. 너는하지 않는다. –