2009-07-28 3 views
5

MSDN은 RegisterWindowMessage() 함수가 프로세스간에 보낼 메시지를 등록하는 데만 사용되는 것이 좋습니다. 메시지가 한 프로세스 내에서 전송되는 데 필요한 경우 WM_APP에서 0xBFFF 범위에서 안전하게 선택할 수 있습니다.RegisterWindowMessage를 남용하면 리소스가 고갈 될 수 있습니까?

그러나 코드베이스에서는 RegisterWindowMessage()가 한 프로세스 내에서 보낸 메시지에만 사용되는 경우가 종종 있습니다. 이것은 WM_APP..0xBFFF 범위의 메시지 식별자를 수동으로 배포 할 필요가 없으므로 RegisterWindowMessage()를 사용하는 것이 단순하다는 인식 때문에 이루어 졌다고 봅니다.

많은 응용 프로그램이 하나의 컴퓨터에서 실행되고 서로 다른 문자열로 RegisterWindowMessage()를 호출하면 RegisterWindowMessage()에서 반환 할 수있는 메시지 식별자 범위를 소모 할 수 있으며 그 중 일부는 실패를 나타내는 값을 반환합니까? WM_APP..0xBFFF 범위 메시지로 충분할 경우 RegisterWindowMessage() 메시지를 사용하는 유효한 이유는 무엇입니까?

답변

4

이럴 경우에만 자신에게 메시지를 보내는 경우 RegisterWindowMessage를 사용하는 유효한 이유가 없다

있습니다

에는 (문서화) 방식으로하지 않은 등록 앱이 종료 후, 메시지 등록이있을 것입니다, 그래서 메시지를 원자 테이블에서 재부팅/로그 오프 할 때까지 (나는이 원자 테이블이 어디에 저장되어 있는지 정확하게 기억할 수 없다. 윈도우 스테이션이나 터미널 서버 세션 인스턴스 일 것이다)

5

자신에게 메시지를 보낼 때도 RegisterWindowMessage를 사용해야하는 이유는 그것은 WM_APP + N 범위에서 메시지를 방송하는 바보로부터 당신을 보호합니다.

예. 그렇습니다.

3

가능한 장점은 Spy ++가보다 유익한 텍스트를 표시 할 수 있으므로 디버깅이 좀 더 쉽다는 것입니다. 물론

<00129> 004F0DA0 S message:0xC2B0 [Registered:"AFX_WM_ONCHANGE_ACTIVE_TAB"] wParam:00000001 lParam:02B596E8 

<00058> 00330CA2 S message:0x0419 [User-defined:WM_USER+25] wParam:00000000 lParam:00000000 

비교, 원칙적으로 메시지 ID에서 실행 할 수있는 기회가있다. 한편, MFC 기능 팩의 소스 코드에는 RegisterWindowMessage에 52 건의 호출이 있습니다. 그래서 여전히 다른 응용 프로그램을 위해 남아있는 ID는 16300입니다.

5

RegisterWindowMessage를 남용하면 잠재적으로 Windows 상자를 사용할 수 없게 될 수 있습니다. 창 메시지 이름이 동적으로 생성되고 버그로 인해 제어 창 메시지가 할당되지 않으면 특히 그렇습니다. 이 경우 Windows 스테이션/데스크탑의 전역 원자 테이블이 채워지고 User32.dll (기본적으로 모든 응용 프로그램)을 사용하는 모든 프로세스가 시작되지 않고 창을 생성하지 못합니다.

버그가 있습니다. XXXX가 메모리 주소 (또는 다른 동적 수정 자) 인 ControlOfsXXXXXX로 시작하는 메시지를 등록하는 Delphi/Borland 제품. 자주 시작되고 중지되는 응용 프로그램은 여러 개의 ControlOfsXXXX 원자를 등록하고 결국 원자 공간을 소모합니다. 자세한 내용은 다음을 참조하십시오

http://blogs.msdn.com/b/ntdebugging/archive/2012/01/31/identifying-global-atom-table-leaks.aspx

그리고

이 이

https://forums.embarcadero.com/thread.jspa?threadID=47678

+0

은 C++ 빌더/델파이에서 해당 버그에 대해 알고하지 않았다! Nothing ... –

+0

C++ Builder/Delphi (VCL)는'HInstance' ('GetModuleHandle')와 Thread ID로부터 메시지 이름을 생성합니다.정상 실행 파일의 경우'HInstance'는 다양하지 않고 스레드 ID의 범위가 제한되어 있으므로 VCL 응용 프로그램이 원자 테이블을 소모하지는 않습니다. VCL에 내장 된 DLL의 경우 더 그럴듯합니다. 또는 실행 파일에 ASLR이 설정된 경우 (Windows 8 인증의 요구 사항은 무엇입니까?) –

관련 문제