Current version of structure NOTIFYICONDATA

Windows specific forum
Little John
Addict
Addict
Posts: 4786
Joined: Thu Jun 07, 2007 3:25 pm
Location: Berlin, Germany

Current version of structure NOTIFYICONDATA

Post by Little John »

Hi all,

in my program, I want to use the most recent version of the Windows structure NOTIFYICONDATA.
Unfortunately, the version of that structure which is built-in in the PB IDE is rather old.
This is the current version (source):

Code: Select all

typedef struct _NOTIFYICONDATAA {
  DWORD cbSize;
  HWND  hWnd;
  UINT  uID;
  UINT  uFlags;
  UINT  uCallbackMessage;
  HICON hIcon;
#if ...
  CHAR  szTip[64];
#else
  CHAR  szTip[128];
#endif
  DWORD dwState;
  DWORD dwStateMask;
  CHAR  szInfo[256];
  union {
    UINT uTimeout;
    UINT uVersion;
  } DUMMYUNIONNAME;
  CHAR  szInfoTitle[64];
  DWORD dwInfoFlags;
  GUID  guidItem;
  HICON hBalloonIcon;
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
I found that structure converted to PureBasic on the German forum:

Code: Select all

Structure NOTIFYICONDATAA
   cbSize.l
   CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
      PB_Alignment1.b[4]
   CompilerEndIf
   hWnd.i
   uID.l
   uFlags.l
   uCallbackMessage.l
   CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
      PB_Alignment2.b[4]
   CompilerEndIf
   hIcon.i
   StructureUnion
      szTip.s{64}
      szTipEx.s{128}
   EndStructureUnion
   dwState.l
   dwStateMask.l
   szInfo.s{256}
   StructureUnion
      uTimeout.l
      uVersion.l
   EndStructureUnion
   szInfoTitle.s{64}
   dwInfoFlags.l
   guidItem.GUID
   hBalloonIcon.i
EndStructure 
Can someone with knowledge in this area please check whether this PB code is the proper equivalent of the C++ structure?
Thanks in advance!
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4953
Joined: Sun Apr 12, 2009 6:27 am

Re: Current version of structure NOTIFYICONDATA

Post by RASHAD »

Hi
Maybe

Code: Select all

  Structure NOTIFYICONDATAA Align #PB_Structure_AlignC
    cbSize.l
    hwnd.i
    uId.l
    uFlags.l
    uCallbackMessage.l
    hIcon.i
    StructureUnion
      szTip.s{64}
      szTipEx.s{128}
    EndStructureUnion
    dwState.l
    dwStateMask.l
    szInfo.s{256}
    StructureUnion
      uTimeout.l
      uVersion.l
    EndStructureUnion
    szInfoTitle.s{64}
    dwInfoFlags.l
    guidItem.GUID
    hBalloonIcon.i
  EndStructure
Egypt my love
BarryG
Addict
Addict
Posts: 4168
Joined: Thu Apr 18, 2019 8:17 am

Re: Current version of structure NOTIFYICONDATA

Post by BarryG »

Here's what I've got in my source (for 64-bit exes only) that works for my app:

Code: Select all

Structure MyNotifyIconData
  cbSize.l
  PB_Alignment1.b[4]
  hWnd.i
  uID.l
  uFlags.l
  uCallbackMessage.l
  PB_Alignment2.b[4]
  hIcon.i
  StructureUnion
    szTip.s{64}
    szTipEx.s{128}
  EndStructureUnion
  dwState.l
  dwStateMark.l
  szInfo.s{256}
  StructureUnion
    uTimeout.l
    uVersion.l
  EndStructureUnion
  szInfoTitle.s{64}
  dwInfoFlags.l
  guidItem.GUID
  hBalloonIcon.i
EndStructure
Little John
Addict
Addict
Posts: 4786
Joined: Thu Jun 07, 2007 3:25 pm
Location: Berlin, Germany

Re: Current version of structure NOTIFYICONDATA

Post by Little John »

Thank you both!
Denis
Enthusiast
Enthusiast
Posts: 778
Joined: Fri Apr 25, 2003 5:10 pm
Location: Doubs - France

Re: Current version of structure NOTIFYICONDATA

Post by Denis »

Definition of _NOTIFYICONDATAW (PB use unicode note Ascii, so the structure is _NOTIFYICONDATAW instead of _NOTIFYICONDATAA)
(File shellapi.h)

Code: Select all

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];
#ifndef _SHELL_EXPORTS_INTERNALAPI_H_
    union {
        UINT  uTimeout;
        UINT  uVersion;  // used with NIM_SETVERSION, values 0, 3 and 4
    } DUMMYUNIONNAME;
#endif
    WCHAR  szInfoTitle[64];
    DWORD dwInfoFlags;
#endif
#if (NTDDI_VERSION >= NTDDI_WINXP)
    GUID guidItem;
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
    HICON hBalloonIcon;
#endif
} NOTIFYICONDATAW, *PNOTIFYICONDATAW;

Code: Select all

  
	/*
	  Code C/C++ Visual Studio 2022 
	*/



#include <iostream>
#include <windows.h>
#include <shellapi.h>


#define PRINTF_SIZEOF(type) printf("  SizeOf( "  #type  " ) = %zu\n", sizeof(type))
// #define PRINTF_OffsetOf(type,member) printf("  OffsetOf(" #type", "#member ") = %zu\n", offsetof(type,member))
#define PRINTF_OffsetOf(type,member) printf("  OffsetOf( "  #member  " ) = %zu\n", offsetof(type,member))


int main()
{
#ifdef UNICODE


#if defined(_WIN64)
	printf("\n");
	printf("\n");
	printf("  Compilation Window 64 bit - mode unicode");
#else
	printf("\n");
	printf("\n");
	printf("  Compilation Window 32 bit - mode unicode");
#endif

	/*
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];
#ifndef _SHELL_EXPORTS_INTERNALAPI_H_
    union {
        UINT  uTimeout;
        UINT  uVersion;  // used with NIM_SETVERSION, values 0, 3 and 4
    } DUMMYUNIONNAME;
#endif
    WCHAR  szInfoTitle[64];
    DWORD dwInfoFlags;
#endif
#if (NTDDI_VERSION >= NTDDI_WINXP)
    GUID guidItem;
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
    HICON hBalloonIcon;
#endif
} NOTIFYICONDATAW, *PNOTIFYICONDATAW;


				*/


	printf("\n");
	printf("  Structure _NOTIFYICONDATAW\n");
	printf("  -----------------\n");

	PRINTF_SIZEOF(_NOTIFYICONDATAW);
	printf("\n");
    PRINTF_OffsetOf(_NOTIFYICONDATAW, cbSize);
	PRINTF_OffsetOf(_NOTIFYICONDATAW, hWnd);
	PRINTF_OffsetOf(_NOTIFYICONDATAW, uID) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, uFlags) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, uCallbackMessage) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, hIcon) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, szTip) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, dwState) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, dwStateMask) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, szInfo) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, uTimeout) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, uVersion) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, szInfoTitle) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, dwInfoFlags) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, guidItem) ;
	PRINTF_OffsetOf(_NOTIFYICONDATAW, hBalloonIcon) ;


#else
	printf("You must compile in unicode mode!\n");
#endif


	return 0;
}

Code: Select all

   ; code PB, .c could be change by .s
                Structure NOTIFYICONDATAW
                  cbSize.l
                  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
                        PB_Alignment1.b[4]
                  CompilerEndIf
                  hWnd.i
                  uID.l
                  uFlags.l
                  uCallbackMessage.l
                  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
                        PB_Alignment2.b[4]
                  CompilerEndIf
                  hIcon.i
                  If the os is < Win 2000 --> szTip must be egal To 64
                  szTip.c[128]
                  dwState.l
                  dwStateMask.l
                  szInfo.c[256]
                  StructureUnion
                        uTimeout.l
                        uVersion.l
                  EndStructureUnion
                  szInfoTitle.c[64]
                  dwInfoFlags.l
                  guidItem.guid
                  hBalloonIcon.i
            EndStructure
Results
///////////////////////////// Compilation Window 32 bit - mode unicode //////////////////////////////////
Visual Studio 2022
Structure _NOTIFYICONDATAW
-----------------
SizeOf( _NOTIFYICONDATAW ) = 956

OffsetOf( cbSize ) = 0
OffsetOf( hWnd ) = 4
OffsetOf( uID ) = 8
OffsetOf( uFlags ) = 12
OffsetOf( uCallbackMessage ) = 16
OffsetOf( hIcon ) = 20
OffsetOf( szTip ) = 24
OffsetOf( dwState ) = 280
OffsetOf( dwStateMask ) = 284
OffsetOf( szInfo ) = 288
OffsetOf( uTimeout ) = 800
OffsetOf( uVersion ) = 800
OffsetOf( szInfoTitle ) = 804
OffsetOf( dwInfoFlags ) = 932
OffsetOf( guidItem ) = 936
OffsetOf( hBalloonIcon ) = 952
///////////////////////////////////////////////////////////////

PureBasic 6.03 LTS
Compilation Window 32 bit - mode Unicode
---------------------------

SizeOf(NOTIFYICONDATAW) = 956

OffsetOf( cbSize ) = 0
OffsetOf( hWnd ) = 4
OffsetOf( uID ) = 8
OffsetOf( uFlags ) = 12
OffsetOf( uCallbackMessage ) = 16
OffsetOf( hIcon ) = 20
OffsetOf( szTip ) = 24
OffsetOf( dwState ) = 280
OffsetOf( dwStateMask ) = 284
OffsetOf( szInfo ) = 288
OffsetOf( uTimeout ) = 800
OffsetOf( uVersion ) = 800
OffsetOf( szInfoTitle ) = 804
OffsetOf( dwInfoFlags ) = 932
OffsetOf( guidItem ) = 936
OffsetOf( hBalloonIcon ) = 952



///////////////////////////// Compilation Window 64 bit - mode unicode //////////////////////////////////

Visual Studio 2022
Structure _NOTIFYICONDATAW
-----------------
SizeOf( _NOTIFYICONDATAW ) = 976

OffsetOf( cbSize ) = 0
OffsetOf( hWnd ) = 8
OffsetOf( uID ) = 16
OffsetOf( uFlags ) = 20
OffsetOf( uCallbackMessage ) = 24
OffsetOf( hIcon ) = 32
OffsetOf( szTip ) = 40
OffsetOf( dwState ) = 296
OffsetOf( dwStateMask ) = 300
OffsetOf( szInfo ) = 304
OffsetOf( uTimeout ) = 816
OffsetOf( uVersion ) = 816
OffsetOf( szInfoTitle ) = 820
OffsetOf( dwInfoFlags ) = 948
OffsetOf( guidItem ) = 952
OffsetOf( hBalloonIcon ) = 968

PureBasic 6.03 LTS
Compilation Window 64 bit - mode Unicode
---------------------------

SizeOf(NOTIFYICONDATAW) = 976

OffsetOf( cbSize ) = 0
OffsetOf( hWnd ) = 8
OffsetOf( uID ) = 16
OffsetOf( uFlags ) = 20
OffsetOf( uCallbackMessage ) = 24
OffsetOf( hIcon ) = 32
OffsetOf( szTip ) = 40
OffsetOf( dwState ) = 296
OffsetOf( dwStateMask ) = 300
OffsetOf( szInfo ) = 304
OffsetOf( uTimeout ) = 816
OffsetOf( uVersion ) = 816
OffsetOf( szInfoTitle ) = 820
OffsetOf( dwInfoFlags ) = 948
OffsetOf( guidItem ) = 952
OffsetOf( hBalloonIcon ) = 968

///////////////////////////////////////////////////////////////

there are conditions with
szTip
dwState
dwStateMask
szInfo
guidItem
hBalloonIcon
A+
Denis
Little John
Addict
Addict
Posts: 4786
Joined: Thu Jun 07, 2007 3:25 pm
Location: Berlin, Germany

Re: Current version of structure NOTIFYICONDATA

Post by Little John »

Thank you, Denis!
Denis
Enthusiast
Enthusiast
Posts: 778
Joined: Fri Apr 25, 2003 5:10 pm
Location: Doubs - France

Re: Current version of structure NOTIFYICONDATA

Post by Denis »

Little John,

i've compiled the structure with :
Windows 11 Professionnel version 23H2 build 22631.2792

So, if u share some app, i think you must use AllocateStructure to define different possible size due to running OS (XP, Win 2000, Vista wich are static compilation OS but when running for example a Win 11 compilation under XP, it may cause trouble).

In the same way, offsets must be calculated according to the running OS.

If you only run for u under Win 11, above structure defined is Ok.
A+
Denis
Little John
Addict
Addict
Posts: 4786
Joined: Thu Jun 07, 2007 3:25 pm
Location: Berlin, Germany

Re: Current version of structure NOTIFYICONDATA

Post by Little John »

Thanks again!
I forgot to say that my program is only for Windows 10 and 11.
Anyway, your remark is important.
Post Reply