PDAclub.pl - Forum użytkowników technologii mobilnych

Windows Mobile (Classic, Professional, Standard), Windows Phone 6.x oraz 7/8.x/10 => Oprogramowanie PPC => Dla programistów => Wątek zaczęty przez: mobit w Lipiec 27, 2010, 12:37:18

Tytuł: Problem z CeClearUserNotification
Wiadomość wysłana przez: mobit w 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
Tytuł: Odp: Problem z CeClearUserNotification
Wiadomość wysłana przez: miba w 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.
Tytuł: Odp: Problem z CeClearUserNotification
Wiadomość wysłana przez: mobit w 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?
Tytuł: Odp: Problem z CeClearUserNotification
Wiadomość wysłana przez: miba w 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?
Tytuł: Odp: Problem z CeClearUserNotification
Wiadomość wysłana przez: mobit w 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.
Tytuł: Odp: Problem z CeClearUserNotification
Wiadomość wysłana przez: miba w 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ę.
Tytuł: Odp: Problem z CeClearUserNotification
Wiadomość wysłana przez: mobit w Sierpień 10, 2010, 15:15:36
Sprobuje.
Dzieki  :ok: