Problem z CeClearUserNotification

  • 6 Odpowiedzi
  • 2231 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

Problem z CeClearUserNotification
« dnia: Lipiec 27, 2010, 12:37:18 »
Witam,
srodowisko: VC++ 2008, WM 6.5 (HTC Sense 2.1)
mam taki problem: okazjonalnie (nie znalazlem reguly) wywala mi sie usuwanie notification funkcja CeClearUserNotification.
Notification dodaje tak:

bool setNotification(LPTSTR app, LPTSTR args, SYSTEMTIME sysTime)
{
HANDLE result;
UserNotificationTrigger nt;

memset(&nt, 0, sizeof(CE_NOTIFICATION_TRIGGER));

nt.dwSize = sizeof(UserNotificationTrigger);
nt.dwType = CNT_TIME;
nt.lpszApplication = app;
nt.lpszArguments = args;
nt.stStartTime = sysTime;

UserNotificationType unType;
memset(&unType, '\0', sizeof(unType));

result = CeSetUserNotificationEx(0, &nt, &unType);
if(!result)
{
//err(TEXT("CeSetUserNotificationEx NULL!"));
}

return (result != 0);
}

Usuwam tak:

bool UnregisterApp(LPCTSTR lpstrExe)
{
UserNotificationTrigger unt = {0};
DWORD dwHowMany = 0, dwBytesNeeded = 0;
CE_NOTIFICATION_INFO_HEADER *notify = NULL;
LPBYTE lpBuffer = NULL;
HANDLE* pHandles = NULL;

if( !CeGetUserNotificationHandles (NULL, 0, &dwHowMany) )
{
//err(( TEXT("CeGetUserNotificationHandles failed <%d>!"), GetLastError() ));
return false;
}

if( dwHowMany == 0 )
{
return true;
}

pHandles = new HANDLE[dwHowMany];
if( pHandles == NULL )
{
//err(( TEXT("pHandles is NULL") ));
return false;
}

if( !CeGetUserNotificationHandles ( pHandles, dwHowMany, &dwHowMany ))
{
//err(( TEXT("CeGetUserNotificationHandles failed!") ));
delete[] pHandles;
return false;
}

   for( DWORD i = 0; i < dwHowMany; i++ )
   {
CeGetUserNotification( pHandles[i], 0, &dwBytesNeeded, NULL);

lpBuffer = NULL;
lpBuffer = new BYTE[dwBytesNeeded];

if( lpBuffer == NULL )
{
//err(( TEXT("lpBuffer is NULL!") ));
continue;
}
memset( lpBuffer, 0, dwBytesNeeded );

if( CeGetUserNotification( pHandles[i], dwBytesNeeded, &dwBytesNeeded, lpBuffer ))
{
notify = (CE_NOTIFICATION_INFO_HEADER*) lpBuffer;

if( notify->pcent->lpszApplication )
{                       
if( _tcsstr( notify->pcent->lpszApplication, lpstrExe ) != NULL )
{
if( !CeClearUserNotification( pHandles[i] ) )
{
//err(( TEXT("CeClearUserNotification <%s> failed <%d>!"),
//   notify->pcent->lpszApplication, GetLastError() ));

delete[] lpBuffer;
delete[] pHandles;

return false;
}
}   
}
}
else
{
//err(( TEXT("CeGetUserNotification failed!") ));
}

delete[] lpBuffer;
}
delete[] pHandles;

return true;
}

Funkcja CeClearUserNotification( pHandles ) generuje lasterror o wartosci: 87 (ERROR_INVALID_PARAMETER).

Jak wczesniej zaznaczylem - nie moge znalezc reguly no i przyczyny. Aczkolwiek stosowalem te funcje tez na starszym urzadzeniu z WM 6.1 bez dodatkow typu manilla, htc sense itd. i wtedy nie bylo problemu.
Udalo sie komus rozwiazac taki problem?

Pzdr

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Problem z CeClearUserNotification
« Odpowiedź #1 dnia: Lipiec 28, 2010, 11:54:10 »
Usuwasz w pętli:
delete[] pHandles;
i później to samo na końcu procedury, co akurat jest ok. W pętli nie masz prawa tej tablicy usunąć co chyba rozumiesz dobrze. Wygląda na przeoczenie. Alokator co nieco modyfikuje tablice przy zwalnianiu i wychodzą śmiecie.

Odp: Problem z CeClearUserNotification
« Odpowiedź #2 dnia: Sierpień 04, 2010, 12:09:02 »
Usuwasz w pętli:
delete[] pHandles;
i później to samo na końcu procedury, co akurat jest ok. W pętli nie masz prawa tej tablicy usunąć co chyba rozumiesz dobrze.
No tak - usuwam w petli wtedy, kiedy mam zamiar calkiem wyjsc z procedury - zaraz potem jest 'return'.
Lepiej to break-iem zalatwiac?

Alokator co nieco modyfikuje tablice przy zwalnianiu i wychodzą śmiecie.
To jak temu zapobiec?

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Problem z CeClearUserNotification
« Odpowiedź #3 dnia: Sierpień 07, 2010, 21:56:32 »
Sorry zasłoniło mi ten return w okienku. Jest ok.

Natomiast zastanawiam się czy nie jest tak, że zachodzi sekwencja ( wyścig )

- ustanawiasz notyfikację dla aplikacji z parametrami
- pobierasz aktywne notyfikacje i odnajdujesz zainstalowaną
- notyfikacja  się uruchamia w międzyczasie i usuwa
- próbujesz ją usunąć ponownie ale uchwyt już nie wskazuje istniejącej notyfikacji

Czy ta aplikacja instalowana w notyfikacji to jest odrębny program?

Odp: Problem z CeClearUserNotification
« Odpowiedź #4 dnia: Sierpień 08, 2010, 13:28:58 »
Natomiast zastanawiam się czy nie jest tak, że zachodzi sekwencja ( wyścig )
[...]
Czy ta aplikacja instalowana w notyfikacji to jest odrębny program?
Aplikacja pracuje na notyfikacji ustawianej "na siebie".
Innymi slowy: chce, zeby aplikacja uruchamiala sie co jakis czas.
Kiedy ustawialem tylko nowa notyfikacje, multiplikowaly sie one, wiec okazalo sie, ze w trakcie dzialania programu musze usuwac poprzednia.
Robie to w poczatkowej czesci aplikacji.
Dziwne jest to, ze sprawdzanie dochodzi az tak daleko - do momentu sprawdzania nazwy i dopiero tam sie wywala.
Nie wiem czemu, ale mam wrazenie, ze to wplyw HTC Sense - juz w paru przypadkach cos co chodzilo bez niego, teraz nie dziala :/
Sprobuje potestowac z tydzien przy wylaczonym.
Chociaz tak czy inaczej, pewnie musi byc sposob, zeby napisac to tak, zeby dzialalo tez z tym.

Tak czy inaczej - dzieki za dotychczasowe podpowiedzi.

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Problem z CeClearUserNotification
« Odpowiedź #5 dnia: Sierpień 10, 2010, 08:31:05 »
Zamień

CeClearUserNotification( pHandles[ i ] )

na

CeClearUserNotification( notify->hNotification )

Ja bym jeszcze zamienił:
pHandles = new HANDLE[dwHowMany];
na:
pHandles = new HANDLE[dwHowMany+10]; // +jakaś niewielka liczba

bo w międzyczasie może dojść jakaś notyfikacja i następujące pobranie uchwytów może się nie powieść, a tak mamy małą rezerwę.
« Ostatnia zmiana: Sierpień 10, 2010, 15:46:47 wysłana przez miba »

Odp: Problem z CeClearUserNotification
« Odpowiedź #6 dnia: Sierpień 10, 2010, 15:15:36 »
Sprobuje.
Dzieki  :ok: