La prima cosa che io farei nel tuo codice è rimuovere la gestione delle stringhe ANSI/MBCS (ovvero char*, NOTIFYICONDATAA, strcpy, Shell_NotifyIconA...).
Siamo nel 2009 (e hai come target Windows 7, non Windows 95/98), per cui è opportuno usare stringhe Unicode (ovvero WCHAR *, etc.).
Inoltre, c'è un problema di const-correctness sui parametri in input.
Ad esempio szBalloonTitle è dichiarato come char*, invece dovrebbe essere const char * (o, meglio, considerato quanto scritto nel paragrafo precedente, const WCHAR *, ovvero LPCWSTR).
Ancora, c'è un problema con l'uso di funzioni obsolete e
non sicure come
strcpy. Ti consiglio vivamente di usare funzioni della nuova
Safe String Library, come
StringCchCopy.
Questo codice compilato con VS2008 SP1 funziona correttamente sulla mia copia di Windows 7:
BOOL ShowBalloon(LPCWSTR pszTitle, LPCWSTR pszText, DWORD dwIcon)
{
NOTIFYICONDATA nid = {sizeof(nid)};
nid.uFlags = NIF_INFO | NIF_GUID;
nid.guidItem = __uuidof(PrinterIcon);
nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;
StringCchCopy(nid.szInfoTitle, ARRAYSIZE(nid.szInfoTitle), pszTitle);
StringCchCopy(nid.szInfo, ARRAYSIZE(nid.szInfo), pszText);
LoadIconMetric(g_hInst, MAKEINTRESOURCE(dwIcon), LIM_LARGE, &nid.hBalloonIcon);
return Shell_NotifyIcon(NIM_MODIFY, &nid);
}
BOOL ShowPrintJobBalloon()
{
return ShowBalloon( L"Some title", L"Some text...", IDI_NOTIFICATIONICON );
}
Ho semplicemente eseguito un piccolo refactoring (per isolare i parametri
pszTitle e
pszText) su un codice presente in un esempio fornito con il Windows 7 SDK:
NotificationIcon (si trova in C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\winui\shell\appshellintegration oppure online su CodeGallery).
(L'esempio originale usa LoadString per caricare le stringhe da risorse.)
HTH,
Giovanni