나는 WndProc(Message m)
오버라이드가 있습니다. 이것은 분명히 많이 불린다. 일부 메시지를 "처리 됨"으로 표시하려고한다고 가정 해 봅시다. 그래서 Result
을 1로 설정해야합니다. 그러나 Result
속성은 IntPtr
입니다. m.Result = new IntPtr(1)
이 실행되면 어떻게됩니까? 각 호출은 하나의 Int32
값에 대해 메모리를 할당합니까? 고정 IntPtr
변수를 만들고 new IntPtr(1)
으로 설정하면 어떻게됩니까?C# : WndProc() 및 IntPtr 형식 - 올바르게 처리하는 방법? IntPtr 유형은 특별한주의가 필요합니까?
가장 올바른 방법은 무엇입니까?
그러면 알려진 값과 m.LParam
을 비교하고 싶습니다. 또한 IntPtr
그리고 나는 그것을 여러 가지 방법으로 수행 할 수 있습니다 이러한 비교의 비용은 무엇
if (m.LParam == (IntPtr)0x0001) ...
if ((int)m.LParam == 0x0001) ...
if (m.LParam == myStaticIntPtr1) ...
를? 3 세가되면 저수준에서 어떻게됩니까? Message
유형은 일회용이 아닙니다. 따라서 나는 그것을 안전하게 base.WndProc()
으로 전달하는 것을 생략 할 수 있다고 생각합니다. 맞습니까? 그 메시지를 그냥 버리려 고 할 때 그걸로 끝낼 필요가 없나요?
보너스 질문 : 잘 모르겠어요,하지만 난 MSDN 문서의 IntPtr
의 존재는 단지 int
s로 변경되었습니다 pinvoke.net에 DllImport
의를 본 것 같아요. 가능한? 작동합니까? 무슨 일이야? 암시 적 변환?
BTW, IntPtr
은 관리 형입니다. 맞습니까? 따라서 관리되지 않는 코드를 호출하거나 일회용 유형을 사용하지 않으면 아무 것도 처리 할 필요가 없습니다.
너는 엄청나게 * 이것을 생각하고있다. 이것들은 내장 된 기본 유형입니다. 메모리 할당은 비용이 많이 들지 않습니다. 또한이 경우 구조의 필드 값을 설정하므로 메모리가 이미 할당되어 있습니다. 이러한 모든 작업은 사실상 무료입니다.그리고 그것들은 모두 성능면에서 동등합니다. 의미 상 IntPtrs를 int로 캐스팅하는 대신 IntPtr에 캐스팅 상수를 사용하는 것이 좋습니다. –
IntPtr은 관리되지 않는 개체를 가리키는 32 비트 정수입니다. 관리되지 않는 개체는 공유 메모리 (정적)에 있으며 관리 개체와 마찬가지로 실행 스택에 없습니다. IntPtr 또는 int를 사용하는 경우에는 포인터가 서명되어 있지 않으므로 uint가 더 좋을 수 있다는 점을 제외하면 차이가 발생하지 않아야합니다. (IntPtr) 0x0001은 메모리 위치 0x0001을 가리 키기 때문에 아무런 의미가 없습니다. – jdweng
또한 한 가지 질문에 너무 많은 질문을 던졌습니다. 그 중 일부에 간단히 대답하려고 노력합니다 ... 아니요, 항상 기본 클래스의 창 프로 시저에 메시지를 전달해야합니다. 아니요, 포인터 유형에 int를 사용하는 DllImport 시그니처가 잘못되어 파손되었습니다. 그러지 마. 예, IntPtr은 관리되는 형식이지만 CLR 마샬 러는이를 인식하고 포인터와 같은 값을 올바르게 정렬합니다. 그러나 여전히 관리되지 않는 객체에 대한 포인터이므로 관리되지 않는 객체는 문서화 요구 사항에 따라 폐기/삭제/해제/폐쇄되어야합니다. –