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
-
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
-
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.
-
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?
-
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?
-
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.
-
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ę.
-
Sprobuje.
Dzieki :ok: