Page 1 of 1
Current version of structure NOTIFYICONDATA
Posted: Sat Nov 18, 2023 7:56 pm
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!
Re: Current version of structure NOTIFYICONDATA
Posted: Sat Nov 18, 2023 10:41 pm
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
Re: Current version of structure NOTIFYICONDATA
Posted: Sun Nov 19, 2023 2:15 am
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
Re: Current version of structure NOTIFYICONDATA
Posted: Sun Nov 19, 2023 9:05 am
by Little John
Thank you both!
Re: Current version of structure NOTIFYICONDATA
Posted: Sun Nov 19, 2023 5:23 pm
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
Re: Current version of structure NOTIFYICONDATA
Posted: Sun Nov 19, 2023 8:30 pm
by Little John
Thank you, Denis!
Re: Current version of structure NOTIFYICONDATA
Posted: Thu Dec 07, 2023 8:04 am
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.
Re: Current version of structure NOTIFYICONDATA
Posted: Thu Dec 07, 2023 4:21 pm
by Little John
Thanks again!
I forgot to say that my program is only for Windows 10 and 11.
Anyway, your remark is important.