PDA

Visualizza la versione completa : [C++] WinMobile e uso di SetPowerRequirement, SetDevicePower e RegEnumValue


DarthSandr
18-01-2012, 12:01
Ciao a tutti, sto provando a usare le funzioni SetPowerRequirement e SetDevicePower di pm.h ma sto avendo qualche problema.
In un'applicazione per terminale mobile sviluppata con Visual Studio 2008 utilizzando Windows Mobile 5.0 Pocket PC SDK ho implementato la seguente funzione:



void CTestSerialLibPDADlg::ManagePowerSetting() {
DWORD i, dwValueSize, j;
WCHAR Value[REG_SIZE];
WCHAR RegKey[REG_SIZE];
HKEY hkey, hkey1;
DWORD dwValueType = REG_EXPAND_SZ;
WCHAR ValueVect[REG_SIZE];
WCHAR Res[REG_SIZE], Res2[REG_SIZE], Res3[REG_SIZE];

i = 0;
dwValueSize = REG_SIZE;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Drivers\\Active", 0, KEY_ALL_ACCESS, &hkey) == ERROR_SUCCESS) {
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"RegOpenKeyEx 1 OK");
UpdateWindow();
while (RegEnumKeyEx(hkey, i, Value, &dwValueSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
swprintf(RegKey, L"Drivers\\Active\\%s", Value);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegKey, 0, KEY_ALL_ACCESS, &hkey1) == ERROR_SUCCESS) {
dwValueSize = REG_SIZE;
if (RegQueryValueEx(hkey1, L"Key", NULL, &dwValueType, (LPBYTE)Value, &dwValueSize) == ERROR_SUCCESS) {
RegQueryValueEx(hkey1, L"Name", NULL, &dwValueType, (LPBYTE)Res, &dwValueSize);
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Value);
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Res);
UpdateWindow();
if (wcscmp(Value, L"\\Drivers\\SDCARD\\ClientDrivers\\Class\\SDMemory_ Class") == 0) {
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Res);
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Value);
UpdateWindow();

power = SetPowerRequirement(Res, D0, POWER_NAME | POWER_FORCE, 0, 0);

if (power != 0) {
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"success");
UpdateWindow();
}
else {
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"failure");
UpdateWindow();
}

}
}
else {
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"RegQueryValueEx 1 KO");
}
}
else {
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"RegOpenKeyEx 2 KO");
}
i++;
dwValueSize = REG_SIZE;
}
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"while terminato");
}
else {
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"RegOpenKeyEx 1 KO");
}

if (hkey1)RegCloseKey(hkey1);
if (hkey) RegCloseKey(hkey);
}



Con il quale vorrei fare la seguente cosa:
- trovare il driver della microSD inserita nel terminale mobile
- impostare il power manager per fare in modo che la microSD rimanga sempre attiva anche quando il terminale va in stand by.

Durante l'iterazione trovo un dispositivo il cui driver e' \\Drivers\\SDCARD\\ClientDrivers\\Class\\SDMemory_ Class e che corrisponde a DSK2: ma se passo per l'appunto DSK2 a SetPowerRequirement la funzione torna success ma la microSD non rimane attiva quando il terminale va in stand by.
La documentazione della funzione e' qui: http://msdn.microsoft.com/en-us/library/ms920689.aspx e se metto solo POWER_FORCE fallisce.

Se utilizzo questa funzione:


DWORD power = SetDevicePower(Res, POWER_NAME, D1);

switch (power) {
case ERROR_SUCCESS:
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"SUCCESS");
UpdateWindow();
break;
case ERROR_ACCESS_DENIED:
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"ACCESS_DENIED");
UpdateWindow();
break;
case ERROR_FILE_NOT_FOUND:
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"FILE_NOT_FOUND");
UpdateWindow();
break;
case ERROR_INVALID_PARAMETER:
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"INVALID_PARAMETER");
UpdateWindow();
break;
case ERROR_WRITE_FAULT:
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"WRITE_FAULT");
UpdateWindow();
break;
default:
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) L"Unknow Error");
UpdateWindow();
break;
}


addirittura mi da un ERROR_FILE_NOT_FOUND che stando a quanto viene detto qui http://msdn.microsoft.com/en-us/library/ms920584.aspx significa che il device non esiste eppure mi viene tornato un DSK2 associato al driver che (credo) sia quello della microSD.

Cosa sto sbagliando?

Nella documentazione viene detto che bisognerebbe associare il dispositivo ad una classe associata.
Ora tramite un editor del registro scopro che in HKEY_LOCAL_MACHINE\\Drivers\\SDCARD\\ClientDrivers \\Class\\SDMemory_Class ci sarebbe un valore IClass con un elenco di dati compatibili con le classi di cui si parla nella documentazione ma se provo quest'operazione:



LPTSTR sectionValue;
DWORD sectionValueSize= 4096;
DWORD dwType;

j = 0;
dwValueSize = REG_SIZE;
while (RegEnumValue(hkey1, j, ValueVect, &dwValueSize, NULL, &dwType, (LPBYTE)sectionValue, &sectionValueSize) == ERROR_SUCCESS) {
dwValueSize = 1024;
RegQueryValueEx(hkey1, ValueVect, NULL, &dwValueType, (LPBYTE)Res3, &dwValueSize);
// swprintf(Res2, L"Id: %s Value: %s", ValueVect, Res3);
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) ValueVect);
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Res3);
UpdateWindow();
dwValueSize = REG_SIZE;
j++;
}


mi torna dei valori del tutto diversi da quelli che vedo nel registry error, in primis "Name" e "Key" che utilizzo nel primo codice che ho postato.
Mi sto perdendo qualcosa.............

qualcuno ha qualche suggerimento?

Ciao e grazie
Sandro

Loading