Shell_NotifyIcon, NOTIFYICONDATA struct Size
{ NOTIFYICONDATA nid; ZeroMemory(&nid, sizeof(nid)); } |
위의 코드를 통해, 트레이 아이콘의 팝업설명과 풍선도움말을 띄울수 있다.
하지만, (WindowsXP에서의 테스트를 가정할때) VC6.0 & PSDK2003으로 빌드한 실행파일은 정상 동작 하지만, VS2008로 빌드한 실행파일은 풍선 도움말이 팝업되지 않는다.
왜 이런 차이가 발생하는 것일까? 이유인 즉슨,
Shell_NofifyIcon() 은 NOTIFYICONDATA.cbSize를 통해, 입력받은 NOTIFYICONDATA를 어떻게 해석해야 할지를 결정하게 되는데(많은 수의 Windows API가 struct의 정의를 확인하기 위해 이러한 방식을 사용하고 있다.) PSDK2003 과 VC2008에 정의된 NOTIFYICONDATA구조체가 상이하게 정의 되어 있기 때문이다.
(VC2008과 함께깔리는 SDK(ShellAPI.h)의 NOTIFYICONDATA 정의가 이전버전의 확장버전이다.)
즉 VC2008 로 컴파일 하는 순간, NOTIFYICONDATA 는 확장된 구조체 정의를 사용하게 되며,
이 구조체는 이전 버전의(WindowsXP) Shell32.dll는 Parshing할 수 없는 알수없는 구조체가 되어 버린다고 생각할 수 있다..
[ PSDK2003 ] - ShellAPI.h |
typedef struct _NOTIFYICONDATAA { |
[VS2008 SDK] - ShellAPI.h |
typedef struct _NOTIFYICONDATAA { |
1차적인 책임은 이런 애매한 상황을 만들어 놓은 MS에 있다고 보여지지만, 또 반대로 MS라고 해서 이후의 모든 확장에 대해서 대비할 수는 없지 않겠나?
* MSDN의 아래 내용을 참고하면, Shell32.dll의 버전을 근거로, 유효한 NOTIFYICONDATA.cbSize 를 지정해 주는 방법을 확인 할 수 있다.
아래의 링크를 통해 알게된 사실....많은 수의 Shell Dll들이 버전을 확인 할수 있도록 DllGetVersion함수를 Export하고 있다.
http://msdn.microsoft.com/en-us/library/bb773352(VS.85).aspx
NOTIFYICONDATA Structure
Note that you must initialize the structure with its size. If you use the size of the currently defined structure, the application might not run with earlier versions of Shell32.dll, which expect a smaller structure. You can run your application against earlier versions of Shell32.dll by defining the appropriate version number (see Shell and Common Controls Versions). However, this might cause problems if your application also needs to run on more recent systems.
You can maintain application compatibility with all Shell32.dll versions while still using the current header files by setting the size of the NOTIFYICONDATA structure appropriately. Before you initialize the structure, use DllGetVersion to determine which Shell32.dll version is installed on the system and initialize cbSize with one of these values:
Shell32.dll Version |
cbSize |
6.0.6 or higher (Windows Vista and later) |
sizeof(NOTIFYICONDATA) |
6.0 (Windows XP) |
NOTIFYICONDATA_V3_SIZE |
5.0 (Windows 2000) |
NOTIFYICONDATA_V2_SIZE |
Versions lower than 5.0 (Microsoft Windows NT 4.0, Windows 95, Windows 98) |
NOTIFYICONDATA_V1_SIZE |
Using this value for cbSize allows your application to use NOTIFYICONDATA in a method compatible with earlier Shell32.dll versions.
'Windows Programming' 카테고리의 다른 글
Kernel Object Handle의 정보(Type, Name) 구하기 (0) | 2010.07.19 |
---|---|
Thread별로 관리되는 혹은 초기화 해주어야 하는 것들 (0) | 2010.04.01 |
레지스트리 감시 (0) | 2010.02.26 |
Url parsing (0) | 2010.02.05 |
Visual Studio 소스편집창 분할하기 (0) | 2009.08.05 |