2009-04-13 2 views
1

MSDN의 NOTIFYICONDATA 설명서를 읽었습니다.MSDN 정보 NOTIFYICONDATA의 cbSize 멤버에 대한 문서

NOTIFYICONDATA 구조체에는 구조체의 크기로 cbSize 멤버를 설정해야하지만 NOTIFYICONDATA 구조체의 크기는 모든 Shell32.dll에서 크기가 다르기 때문에 cbSize를 설정하기 전에 Shell32.dll 버전을 가져와야합니다. MSDN에서

다음의 인용은 다음과 같이


가 버전 5.0 이상이면, cbSize 멤버를 초기화합니다.

nid.cbSize = sizeof (NOTIFYICONDATA);

cbSize를이 값으로 설정하면 모든 버전 5.0 및 6.0의 향상된 기능을 사용할 수 있습니다. 이전 버전의 경우 6.0 이전 구조의 크기는 NOTIFYICONDATA_V2_SIZE 상수로 지정되고 5.0 이전 구조는 NOTIFYICONDATA_V1_SIZE 상수로 지정됩니다. 다음과 같이 cbSize 멤버를 초기화합니다. nid.cbSize = NOTIFYICONDATA_V2_SIZE;

이 값을 cbSize로 사용하면 응용 프로그램에서 버전 6.0의 향상된 기능이 없어도 이전 Shell32.dll 버전과 함께 NOTIFYICONDATA를 사용할 수 있습니다.


I 그것은 모호 약간 발견 '는 sizeof (NOTIFYICONDATA)'는 Win98 상이한 값 (Shell32.dll에서 버전 4.x를 사용), 윈도우 2000 (버전 5.0) 및 WINXP (버전 6.0)을 가지고 있기 때문이다. 어떻게하면 '5.0 및 6.0의 모든 기능 향상이 가능합니까?'

NOTIFYICONDATA_V1_SIZE 승 2K (2K를 포함하지 않는다)

NOTIFYICONDATA_V2_SIZE 승을위한 XP

입니다 :

그래서 나는 NOTIFYICONDATA_V1_SIZE의 정의 (아래 소스 코드), 내가 볼 찾았다

그것은 완전히 differen의 (내가 맞다 있는지 확실하지 않습니다)

NOTIFYICONDATA_V3_SIZE 비스타에 대한

입니다 MSDN에서 무엇을 말하는가? Win2K는 없습니까?

저는 지금 당황하고 있습니다. Shell32.dll 버전에 따라 cbSize 멤버를 어떻게 설정해야합니까?

//= = = = = = = = ShellAPI.h = = = = = = = = 

typedef struct _NOTIFYICONDATAA { 
    DWORD cbSize; 
    HWND hWnd; 
    UINT uID; 
    UINT uFlags; 
    UINT uCallbackMessage; 
    HICON hIcon; 
#if (NTDDI_VERSION < NTDDI_WIN2K) 
    CHAR szTip[64]; 
#endif 
#if (NTDDI_VERSION >= NTDDI_WIN2K) 
    CHAR szTip[128]; 
    DWORD dwState; 
    DWORD dwStateMask; 
    CHAR szInfo[256]; 
    union { 
     UINT uTimeout; 
     UINT uVersion; // used with NIM_SETVERSION, values 0, 3 and 4 
    } DUMMYUNIONNAME; 
    CHAR szInfoTitle[64]; 
    DWORD dwInfoFlags; 
#endif 
#if (NTDDI_VERSION >= NTDDI_WINXP) 
    GUID guidItem; 
#endif 
#if (NTDDI_VERSION >= NTDDI_VISTA) 
    HICON hBalloonIcon; 
#endif 
} NOTIFYICONDATAA, *PNOTIFYICONDATAA; 


typedef struct _NOTIFYICONDATAW { 
    DWORD cbSize; 
    HWND hWnd; 
    UINT uID; 
    UINT uFlags; 
    UINT uCallbackMessage; 
    HICON hIcon; 
#if (NTDDI_VERSION < NTDDI_WIN2K) 
    WCHAR szTip[64]; 
#endif 
#if (NTDDI_VERSION >= NTDDI_WIN2K) 
    WCHAR szTip[128]; 
    DWORD dwState; 
    DWORD dwStateMask; 
    WCHAR szInfo[256]; 
    union { 
     UINT uTimeout; 
     UINT uVersion; // used with NIM_SETVERSION, values 0, 3 and 4 
    } DUMMYUNIONNAME; 
    WCHAR szInfoTitle[64]; 
    DWORD dwInfoFlags; 
#endif 
#if (NTDDI_VERSION >= NTDDI_WINXP) 
    GUID guidItem; 
#endif 
#if (NTDDI_VERSION >= NTDDI_VISTA) 
    HICON hBalloonIcon; 
#endif 
} NOTIFYICONDATAW, *PNOTIFYICONDATAW; 


#define NOTIFYICONDATAA_V1_SIZE  FIELD_OFFSET(NOTIFYICONDATAA, szTip[64]) 
#define NOTIFYICONDATAW_V1_SIZE  FIELD_OFFSET(NOTIFYICONDATAW, szTip[64]) 
#ifdef UNICODE 
#define NOTIFYICONDATA_V1_SIZE  NOTIFYICONDATAW_V1_SIZE 
#else 
#define NOTIFYICONDATA_V1_SIZE  NOTIFYICONDATAA_V1_SIZE 
#endif 


#define NOTIFYICONDATAA_V2_SIZE  FIELD_OFFSET(NOTIFYICONDATAA, guidItem) 
#define NOTIFYICONDATAW_V2_SIZE  FIELD_OFFSET(NOTIFYICONDATAW, guidItem) 
#ifdef UNICODE 
#define NOTIFYICONDATA_V2_SIZE  NOTIFYICONDATAW_V2_SIZE 
#else 
#define NOTIFYICONDATA_V2_SIZE  NOTIFYICONDATAA_V2_SIZE 
#endif 


#define NOTIFYICONDATAA_V3_SIZE  FIELD_OFFSET(NOTIFYICONDATAA, hBalloonIcon) 
#define NOTIFYICONDATAW_V3_SIZE  FIELD_OFFSET(NOTIFYICONDATAW, hBalloonIcon) 
#ifdef UNICODE 
#define NOTIFYICONDATA_V3_SIZE  NOTIFYICONDATAW_V3_SIZE 
#else 
#define NOTIFYICONDATA_V3_SIZE  NOTIFYICONDATAA_V3_SIZE 
#endif 

은 (코드가 웹 사이트에 잘 보이지 않는 것 같다,하지만, 모두 같은 ShellAPI.h에서)

+1

올바르게 표시하려면 코드의 4 칸을 들여 쓰거나 전체 코드를 선택하고 Ctrl + K를 누르십시오. – Ismael

답변

4

플랫폼 sdk 헤더를 통해 사용할 수있는 기능은 _WIN32_WINNT으로 제어되며 대상 운영 체제의 하위 버전으로 정의해야합니다.http://msdn.microsoft.com/en-us/library/6sehtctf.aspx에서

올바른 값은 다음과 같습니다

윈도우 2000 운영 체제, Windows XP 용 0x0501, Windows Server 2003 용 0x0502 에 대한 0x0500 및 Windows Vista 용 0x0600 .

그래서 NOTIFYICONDATA_V1_SIZE 비스타에 대한 XP에 2K, 2K에 NOTIFYICONDATA_V2_SIZE, NOTIFYICONDATA_V3_SIZE보다 낮은 버전 없음을 참조하십시오 (이 경우는 sizeof (NOTIFYICONDATA)를 사용할 수 있습니다).

_WIN32_WINNT으로 프로젝트를 최신 버전으로 컴파일하고 런타임에 실행중인 shell.dll 버전을 확인하면 .cbSize를 올바른 크기로 설정할 수 있으며 나머지 필드는 무시됩니다.

이런 식으로 뭔가 작동합니다 :..

NOTIFYICONDATA notify; 
ZeroMemory(&notify, sizeof(notify)); 
if(version >= VISTA) { 
    notify.cbSize = sizeof(NOTIFYICONDATA); 
} 
else if(version >= XP) { 
    notify.cbSize = NOTIFYICONDATA_V3_SIZE; 
} 
else if(version >= 2K) { 
    notify.cbSize = NOTIFYICONDATA_V2_SIZE; 
} 
else { 
    notify.cbSize = NOTIFYICONDATA_V1_SIZE; 
} 
4

그것은 당신이 컴파일 가장 낮은 Windows 버전에 따라 달라집니다. 크기를 동적으로 설정하지 마십시오. 지원하는 가장 낮은 버전의 Windows에 따라 크기를 설정합니다.

0

는 "그것은 당신이 당신은 동적으로 크기를 설정하지 않는에서 컴파일 가장 낮은 Windows 버전에 따라 달라집니다 당신은 윈도우 당신의 가장 낮은 버전에 따라 크기를 설정 지원하다."

실제로 없습니다. 그냥 비스타에 맞서 빌드하고 XP에서 실행하십시오. 64 + 바이트 메시지 크기의 빈 툴팁 문자열을 얻게됩니다. 안전한 솔루션은 (_WIN32_WINNT >= 0x0600)을 빌드하고 cbSize = NOTIFYICONDATA_V3_SIZE을 설정하는 것입니다.

올바른 해결책은 런타임에 shell32.dll 버전을 확인하는 것입니다. 6.0.6000 - Vista+6.0.0 - XP5.0.0 - W2K

관련 문제