Frage

Ich lese das NOTIFYICONDATA Dokumentation in MSDN.

Es sagt der NOTIFYICONDATA Struktur hat eine cbSize member sollten festgelegt werden, um die Größe der Struktur, aber NOTIFYICONDATA Struktur, die Größe hat verschiedene Größe, in jeder Shell32.dll, so sollten Sie Holen die Shell32.dll version, bevor Sie cbSize.

Die folgenden Zitate von MSDN:


Wenn es ist die version 5.0 oder höher, initialisieren Sie die cbSize member wie folgt.

nid.cbSize = sizeof(NOTIFYICONDATA);

Einstellung cbSize dieser Wert ermöglicht es, alle der version 5.0 und 6.0 Erweiterungen.Für frühere Versionen, die Größe der pre-6.0 Struktur wird durch die NOTIFYICONDATA_V2_SIZE konstant, und die pre-5.0 Struktur wird durch die NOTIFYICONDATA_V1_SIZE konstant.Initialisieren Sie die cbSize member wie folgt.nid.cbSize = NOTIFYICONDATA_V2_SIZE;

Mit diesem Wert für cbSize wird ermöglichen Ihre Anwendung für die Verwendung mit früheren NOTIFYICONDATA Shell32.dll Versionen, allerdings ohne die version 6.0 Erweiterungen.


Ich fand es ein bisschen vage, weil 'sizeof(NOTIFYICONDATA)' hat verschiedenen Wert von Win98 (mit Shell32.dll version 4.x), Win2K (version 5.0) und WinXP (version 6.0).Wie könnte es ermöglichen, alle version 5.0 und 6.0 Verbesserungen'?

Also suchte ich nach der definition von NOTIFYICONDATA_V1_SIZE (source-code wie unten), sehe ich:

NOTIFYICONDATA_V1_SIZE ist für Win 2K (nicht enthalten 2K)

NOTIFYICONDATA_V2_SIZE ist für Win XP

NOTIFYICONDATA_V3_SIZE ist für Vista

(nicht sicher, ob ich richtig bin)

Es ist komplett von MSDN sagt?und keine für Win2K?

Also, ich bin Total verunsichert jetzt.Wie soll ich die cbSize Mitglied nach Shell32.dll version?

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

(Scheint, dass der code nicht gut Aussehen auf der Website, aber es aus ShellAPI.h, die alle die gleiche)

War es hilfreich?

Lösung

Welche features sind verfügbar über die Plattform-sdk-Header gesteuert werden _WIN32_WINNT,, die festgelegt werden sollten, um die niedrigere version des Betriebssystems, auf das Sie abzielen.

Von http://msdn.microsoft.com/en-us/library/6sehtctf.aspx die richtigen Werte sind:

0x0500 für Windows 2000 Betriebssystem 0x0501 für Windows XP, 0x0502 für Windows Server 2003 und 0x0600 für Windows-Vista.

So NOTIFYICONDATA_V1_SIZE sich beziehen auf die version niedriger als 2K, NOTIFYICONDATA_V2_SIZE 2K, NOTIFYICONDATA_V3_SIZE auf XP und keiner von Vista (in diesem Fall können Sie verwenden sizeof(NOTIFYICONDATA)).

Wenn Sie das Projekt kompilieren mit _WIN32_WINNT setzen Sie auf die neueste version, und zu erkennen, welche version der shell.dll Sie werden mit der Laufzeit können Sie festlegen .cbSize, um die richtige Größe die übrigen Felder werden ignoriert.

So etwas sollte funktionieren:

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;
}

Andere Tipps

Es hängt von der niedrigsten Windows-version Sie kompiliert für.Sie setzen nicht die Größe dynamisch.Sie die Größe entsprechend der niedrigsten version von Windows, die Sie unterstützen.

"Es hängt von der niedrigsten Windows-version Sie kompiliert für.Sie setzen nicht die Größe dynamisch.Sie die Größe entsprechend der niedrigsten version von Windows, die Sie unterstützen."

eigentlich nicht.versuchen Sie einfach, bauen gegen VISTA und unter XP.Sie erhalten eine leere QuickInfo-Zeichenfolge, die auf 64+ Byte-Nachricht-Größe.die sichere Lösung ist der Aufbau für (_WIN32_WINNT >= 0x0600) und setzen cbSize = NOTIFYICONDATA_V3_SIZE;

die richtige Lösung ist, zu überprüfen shell32.dll version in run-time. 6.0.6000 - Vista+, 6.0.0 - XP, 5.0.0 - W2K

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top