Today-Plugin zur Anzeige des aktuellen Netzproviders
Hallo,
ich versuche (in Ermangelung eines einfachen und vor allem kostenlosen Plugins) folgendes selbst zu realisieren:
Plugin für den Todayscreen eines Pocket PC Phone Edition (HTC Touch HD *ohne* dieses Touch Plugin, gefällt mir nicht), welches nichts weiter tun soll, als den aktuellen Netzprovider anzuzeigen.
(Hintergrund: Hab nen Dual Sim Adapter im Gerät und es wäre ganz nett beim Blick aufs Todayscreen schon zu sehen, wo man grad eingebucht ist :))
Bin leider (obwohl ich mal vor Urzeiten programmieren gelernt hab :)) auf dem PPC noch blutigster Anfänger. Hab aber mit dem HowTo hier http://www.pocketpc.ch/programmieren...lugin-1-a.html
zumindest mal die groben Züge nachvollziehen und die Testapplikation compilieren und installieren können.
nun zu meiner Frage: Kann mir jemand hier in einfachen Worten (gern auch etwas ausholender, wenns die Zeit zuläßt :)) erklären, wie ich an den Providerstring rankomme, wo ich grad eingebucht bin? Gehen sollte es ja irgendwie - die Telefonapplikation kanns ja schließlich auch. ;)
Wäre super, wenn mir da jemand aushelfen könnte. Mein Dank wird ihn ewig verfolgen *g*
AW: Today-Plugin zur Anzeige des aktuellen Netzproviders
Versuch mal,dir den aktuellen provider aus dem State bereich der registry zu holen.
Z. Bsp so
Code:
WCHAR wc[80];
DWORD dw_wc = 80;
if ( utRegGetSTRING(HKEY_LOCAL_MACHINE,
_T( "System\\State\\Phone"),
_T( "Current Operator Name"), wc, dw_wc ) )
{
....
}
hier noch ein paar funktionen um den registry zugriff zu vereinfachen....
Code:
/* generic get registry function */
BOOL utRegGetValue(HKEY hkKEY, WCHAR *pwcPath, WCHAR *pwcVar, DWORD *pdwType, PBYTE pbData, DWORD *pdwSize)
{
HKEY hk;
BOOL rtn = FALSE;
if ( ERROR_SUCCESS==RegOpenKeyEx(hkKEY, pwcPath, (DWORD)0, KEY_QUERY_VALUE, &hk) )
{
if ( ERROR_SUCCESS==RegQueryValueEx( hk,pwcVar,NULL,pdwType,pbData,pdwSize) )
{
rtn = TRUE;
}
}
RegCloseKey(hk);
return(rtn);
}
/* get a STRING from registry */
BOOL utRegGetSTRING(HKEY hkKEY, WCHAR *pwcPath, WCHAR *pwcVar, WCHAR *pwcData, DWORD dwSize)
{
LONG rtn;
DWORD dwt, dws=dwSize;
/* get the size only */
rtn = utRegGetValue(hkKEY, pwcPath, pwcVar, &dwt, NULL, &dws);
if ( dwt!=REG_SZ ) return(FALSE);
if ( ERROR_SUCCESS==rtn )
{
if ( dws <= dwSize )
{
rtn = utRegGetValue(hkKEY, pwcPath, pwcVar, &dwt, (PBYTE)pwcData, &dws);
}
else
{
PBYTE wc;
wc = (PBYTE)malloc( sizeof(BYTE)*dws );
if ( wc==NULL ) return FALSE;
rtn = utRegGetValue(hkKEY, pwcPath, pwcVar, &dwt, wc, &dws);
if ( ERROR_SUCCESS==rtn )
{
swprintf(pwcData,_T("%.*s..."), dwSize-4, wc);
}
free(wc);
}
}
return( ERROR_SUCCESS==rtn );
}
mfg nimodo
AW: Today-Plugin zur Anzeige des aktuellen Netzproviders
faszinierend - ich hab mich schon mit irgendwelchen kruden Abfragen an die SIM-Karte hantieren sehen. so schaut das ja sogar einigermaßen einfach aus *g*.
Ich merk schon, daß ich mir die Registry wohl mal eingehender ansehen muß. Wer weiß, was da sonst noch so an Nettigkeiten dynamisch gespeichert wird. ;)
Auf alle Fälle erstmal ein Danke! Werd mich vermutlich Abend drüber hermachen und mich weiter versuchen.
AW: Today-Plugin zur Anzeige des aktuellen Netzproviders
so... der gute Obelix hat wohl doch den Mund etwas zu voll genommen und seine angestaubten C-Kenntnisse überschätzt. ;)
mir fällt da was auf die Füße, wo ich sebst wohl aufgrund Denkblockade oder schlichtweg nicht mehr wissens nicht weiterkomme.
Im groben habe ich das GPS-Todayplugin von nimodo hergenommen und alles was ich nicht brauchte rausgeworfen. Dann noch ne Handvoll Variablen deklariert und wollte dann an sich den Providerstring auslesen lassen.
hier erstmal codeschnipselchen:
Code:
WCHAR wc[80]; /* kommt aus der Registry */
DWORD dw_wc = 80;
WCHAR g_Provider[80]; /* Provider Information */
und dann im Main Windows Event handler folgendes (alle anderen funktionen usw. mal ausgelassen, die sind nicht mein Problem)
/* Reg Auslesen */
if ( utRegGetSTRING(HKEY_LOCAL_MACHINE,
_T( "System\\State\\Phone"),
_T( "Current Operator Name"), wc, dw_wc ) )
{
g_Provider = wc;
}
swprintf( g_sInfo1, TEXT("Provider: %s"), g_Provider);
/* Reg Auslesen Ende! */
DrawText(hdc, g_sInfo1, wcslen(g_sInfo1), &g_rUpdate1, DT_SINGLELINE );
die Stelle
fällt mir irgendwie auf die Füße, wegen inkompatibler Datentypen bricht der compier ab.
Ich bin mir ziemlich sicher, daß es nur eine Kleinigkeit ist, aber das wilde Herumhantieren mit Pointern ist mir wohl über den Laufe der Zeit etwas entfallen ;)
ich kann das Projekt auch noch mal komplett als zipfile anbieten zum Reinschauen:
http://rapidshare.de/files/47814148/..._Today.7z.html
Fehlermeldung ist im Übrigen diese:
TodayExample_1.c(210): error #2168: Operands of = have incompatible types 'wchar_t [80]' and 'wchar_t *'.
TodayExample_1.c(210): error #2088: Lvalue required
*** Fehlercode: 1 ***
Fertig.
wo liegt jetzt doch gleich mein Fehler?
Danke schon mal vorab!
Obelix
AW: Today-Plugin zur Anzeige des aktuellen Netzproviders
Das '=' (g_Provider = wc) funktioniert normalerweise (in C) nicht bei statischen "Vektoren" (eg Zeichenketten wc[...]).
Den obigen Compile-Fehler beheben kannst, indem z.Bsp. die Zeichenkette kopierst mit
wcscpy( g_Provider , wc );
Oder direkt g_Provider anstelle von wc benutzt.
mfg - nimodo
AW: Today-Plugin zur Anzeige des aktuellen Netzproviders
danke. :)
und stimmt, irgendwas war da. ;) Alles doch schon zu lange her *g*
den vorhin beschriebenen compile Error hab ich beseitigt, es läuft alles durch, aber trotzdem gibt mir das Today-Plugin dann nichts aus. Naja, außer dem "Provider: " im Plugin, was ich ja in der codezeile
swprintf( g_sInfo1, TEXT("Provider: %s"), g_Provider);
in die Variable gebe, die ich dann mittels Drawtext ausgeben lasse.
geh ich denn richtig in der Annahme, daß der Funktionsaufruf
Code:
if ( utRegGetSTRING(HKEY_LOCAL_MACHINE,
_T( "System\\State\\Phone" ),
_T( "Current Operator Name" ), wc, dw_wc ) )
{
wcscpy( g_Provider, wc );
}
hinreichend ausreichend ist, um in dem Parameter "wc" den Key aus der Registry abzulegen, oder muß ich da noch irgendwas tun? (Ich meine, daß es reichen müßte, da ja wc ein Ausgabeparameter von utRegGetSTRING ist, oder?)
Ich hab auch extra noch mal nachgeschaut, ob der Pfad und der Key richtig geschrieben sind.
Daß ich die \\ schreiben muß, ist doch korrekt, oder? Bei einem einzelnen \ führt nämlich der Compiler Beschwerde, daß da unbekannte Character Escape-Sequenzen rumschwirren.
Irgendwie muß das doch zu schaffen sein, diesen lausigen String da in das Plugin zu prügeln ;)
Noch ne andere dumme Frage... Gibt es eigentlich eine Möglichkeit, die Projekte irgendwie zu debuggen? Also sprich Codezeile für Codezeile zu durchlaufen und mir anzusehen, was in den Variablen so vorhanden ist? Denke das würde mir bei meinem Fehler weiterhelfen ruaszufinden, ob *überhaupt* irgendwas in meine Variable geschrieben wurde.
Tante Edit: Ich update mich mal selbst, vielleicht hat nimodo ja noch mal nen schlauen Tip für mich. ;)
Mir scheint es so, daß hier drin
Code:
if ( utRegGetSTRING(HKEY_LOCAL_MACHINE,
_T( "System\\State\\Phone" ),
_T( "Current Operator Name" ), wc, dw_wc ) )
{
wcscpy( g_Provider, wc );
}
das wcscpy gar nicht ausgeführt wird. Hatte versucht, mir mit Messageboxes mal kleien Debugmessages rauszulassen (geht vllt. auch anders - ich hab mir halt so geholfen, mangels besserem Wissen ;)). Hatte eine Box *vor* die If-Abfrage getan, eine *in* die If. DIe Box davor kam an, die im If nicht.
Von daher gehe ich davon aus, daß ich dort hinschreiben kann so viel ich will - es wird gar nicht angesehen im Programmlauf.
Hab ich irgendwo einen Denk-/Verständnisfehler im Aufruf dieser Registry-Funktion?
AW: Today-Plugin zur Anzeige des aktuellen Netzproviders
ja, die getstring hat irgendwo einen haken
-Versuch mal diese, die sollte gehen
Code:
/* get a STRING from registry */
BOOL utRegGetSTRING(HKEY hkKEY, WCHAR *pwcPath, WCHAR *pwcVar, WCHAR *pwcData, DWORD dwSize)
{
BOOL rtn;
DWORD dwt=REG_SZ, dws=dwSize;
rtn = utRegGetValue(hkKEY, pwcPath, pwcVar, &dwt, (PBYTE)pwcData, &dws);
return(rtn );
-Variablen sollten in jedem Fall belegt werden
Code:
/* Hier das Reg Auslesen hin! */
wcscpy( g_sInfo1 , _T("Provider: n/a") );
if ( utRegGetSTRING(HKEY_LOCAL_MACHINE,
_T( "System\\State\\Phone"),
_T( "Current Operator Name"), g_Provider, g_dwProvider)==TRUE )
{
swprintf( g_sInfo1, TEXT("Provider: %s"),g_Provider);
}
/* Reg Auslesen Ende! */
- g_sInfo sollte grösser sein als g_Provider
- mit RegistryNotifyWindow() siehe beispiel kannst das auch eleganter tun
mfg - nimodo
Liste der Anhänge anzeigen (Anzahl: 1)
AW: Today-Plugin zur Anzeige des aktuellen Netzproviders
nachdem es jetzt ein Ergebnis hat, kann ich auch anfangen es elegant zu machen *g*
Danke erstmal für die andere Funktion zum Registry auslesen - jetzt tut es was es soll ;)
Falls es irgendwem (außer mir :)) etwas nutzt, habe ich den Quelltext angehangen.