2009-04-13 5 views
1

Je suis en train de lire la documentation NOTIFYICONDATA dans MSDN. Il indique que la structure NOTIFYICONDATA a un membre cbSize doit être défini à la taille de la structure, mais la taille de la structure NOTIFYICONDATA a une taille différente dans chaque Shell32.dll, vous devez donc obtenir la version Shell32.dll avant de définir cbSize.À propos de la documentation MSDN sur le membre cbSize de NOTIFYICONDATA

Les citations suivantes de MSDN:


Si elle est une version 5.0 ou ultérieure, initialiser le membre cbSize comme suit.

nid.cbSize = taille de (NOTIFYICONDATA);

La définition de cbSize à cette valeur active toutes les améliorations de la version 5.0 et 6.0. Pour les versions antérieures, la taille de la structure pré-6.0 est donnée par la constante NOTIFYICONDATA_V2_SIZE et la structure pré-5.0 est donnée par la constante NOTIFYICONDATA_V1_SIZE. Initialisez le membre cbSize comme suit. nid.cbSize = NOTIFYICONDATA_V2_SIZE; L'utilisation de cette valeur pour cbSize permettra à votre application d'utiliser NOTIFYICONDATA avec les versions antérieures de Shell32.dll, mais sans les améliorations de la version 6.0.


Je l'ai trouvé un peu de vague, parce que 'sizeof (NOTIFYICONDATA)' a une valeur différente dans Win98 (en utilisant la version 4.x Shell32.dll), Win2K (version 5.0) et Windows XP (version 6.0). Comment pourrait-il 'activer toutes les améliorations de la version 5.0 et 6.0'?

J'ai donc cherché la définition de NOTIFYICONDATA_V1_SIZE (code source comme ci-dessous), je vois:

NOTIFYICONDATA_V1_SIZE est pour Win 2K (ne comprend pas 2K)

NOTIFYICONDATA_V2_SIZE est pour Win XP

NOTIFYICONDATA_V3_SIZE est pour Vista

(pas sûr si je suis à droite)

Il est tout à fait différen t de ce que dit MSDN? et aucun pour Win2K?

Donc, je suis totalement confus en ce moment. Comment est-ce que je devrais placer le membre de cbSize selon la version de Shell32.dll?

//= = = = = = = = 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 

(On dirait que le code ne semble pas bon sur le site Web, mais de Shellapi.h, tout de même)

+1

Vous devez mettre en retrait avec quatre espaces le code à afficher correctement, ou sélectionnez le code entier et appuyez sur Ctrl + K. – Ismael

Répondre

4

Fonctionnalités disponibles via la plateforme Les en-têtes sdk sont contrôlés par _WIN32_WINNT, qui doit être défini sur la version inférieure du système d'exploitation que vous ciblez.

De http://msdn.microsoft.com/en-us/library/6sehtctf.aspx les valeurs correctes sont les suivantes:

0x0500 pour le système d'exploitation Windows 2000 , 0x0501 pour Windows XP, 0x0502 pour Windows Server 2003 et 0x0600 pour Windows Vista.

Alors NOTIFYICONDATA_V1_SIZE se réfèrent à une version inférieure à 2K, NOTIFYICONDATA_V2_SIZE 2K, XP à NOTIFYICONDATA_V3_SIZE et aucun à Vista (dans ce cas, vous pouvez utiliser sizeof (NOTIFYICONDATA)).

Si vous compilez votre projet avec _WIN32_WINNT défini sur la dernière version et que vous détectez la version de shell.dll que vous exécutez à l'exécution, vous pouvez définir .cbSize à la bonne taille, le reste des champs sera ignoré.

Quelque chose comme cela devrait fonctionner:..

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

Cela dépend de la version de Windows la plus basse pour vous compilez. Vous ne définissez pas la taille de manière dynamique. Vous définissez la taille en fonction de la version la plus basse de Windows que vous prenez en charge.

0

« Cela dépend de la version de Windows plus bas que vous compilez pour vous ne définissez pas la taille dynamique Vous définissez la taille en fonction de la version la plus basse de Windows soutien."

en fait pas. essayez simplement de construire contre VISTA et de courir sous XP. Vous obtiendrez une chaîne d'info-bulle vide sur la taille du message de 64 octets et plus. la solution sûre est de construire pour (_WIN32_WINNT >= 0x0600) et mettre cbSize = NOTIFYICONDATA_V3_SIZE;

la bonne solution est de vérifier shell32.dll version en cours d'exécution. 6.0.6000 - Vista+, 6.0.0 - XP

Questions connexes