Die FAQ.
1.Was
heißt eigentlich "CE"
Consumer Electronics. Also Elektronik für Verbraucher. CE soll
überall Einsatz finden, nicht nur in PPC's oder Handhelds sondern auch in
Fernsehern, Toastern oder Autoradios.
2.Was
brauche ich, um VB-Applikationen schreiben zu können?
Das embedded Toolkit von Microsoft, ein Plattform SDK (PocketPC,
PPC-SDK, HPC-SDK oder HPC-2000 SDK; ebenfalls Microsoft), ActiveSync und,
wenn eine Emulation erwünscht ist: Windows NT/2000 als Plattform.
3.Kann
ich alle Controls aus VB weiterbenutzen?
Ganz einfach: Nein. Mit dem SDK
wird ein neuer Satz Steuerelemente mitgeliefert. Diese existieren separat für
die verschiedenen Prozessorversionen, die Version x86 ist ausschließlich für
den CE-Emulator gedacht. Nur speziell für CE entwickelte Controls lassen sich
integrieren.
4.
Gibt es Unterschiede zu Variablentypen und Deklarationen im
"normalen" VB?
Und ob. Der einzige Variablentyp,
der in einer CE-Anwendung zur Verfügung steht ist Variant. Sollten
API-Funktionen zum Einsatz kommen, so muß peinlich darauf geachtet werden, daß
für die Funktionsüber- und Rückgabe der jeweils benötigte Variablentyp
"emuliert" wird.
5.Die
Methode "unload form" erzeugt einen Laufzeitfehler, warum?
Einmal geladene Forms lassen sich
mit CE nur verstecken (hide), nicht jedoch (oder besser: nicht ganz einfach)
entladen. Die Methode "Unload" wird im SDK zwar nicht beanstandet, sie
funktioniert eben nur nicht.
6.
Kann man MDI-Forms erzeugen?
Nein.
7.
Kann man Klassenmodule erzeugen?
Nein.
8.
Existieren Controls zur Datenbankbedienung (ADO/RDO-Steuerelemente)?
Nein, es existieren keine Controls,
wohl aber eine ADOCE-Version, die diverse Methoden zur Datenbankbehandlung
unterstützt.
9.
Können Felder Datengebunden sein?
Kein Steuerelement kann eine
direkte Datenbindung besitzen. Um jede Kleinigkeit (also das besetzen von
Steuerelementen mit Daten aus Datenbanktabellen, schreiben von geänderten
Steuerelement-Inhalten in Datenbanktabellen) muß sich der Programmierer selbst
kümmern, unter der Vorraussetzung, daß CE-Applikationen schon aufgrund der
Ressourcen des Gerätes nicht denselben Umfang erhalten können, wie
Desktop-Applikationen ist das aber IMHO zu verschmerzen.
10. Gibt es
Newsgruppen zum Thema CE?
Ja, auf den ersten
Blick folgende:
| microsoft.public.vb.vbce | alles rund um Visual Basic und CE |
| microsoft.public.vc.vcce | Fragen zu Visual C für CE |
| microsoft.public.ado.wince | Datenbankbezogene Fragen |
| microsoft.public.windowsce | allgemeines CE-Forum von Microsoft |
| microsoft.public.windowsce.developer.betas | Fragen zu MS-Betaversionen |
| microsoft.public.windowsce.embedded | Embedded Systems (CE in anderen Geräten) |
| basicworld.public.vb.ce | die Entsprechung zur MS-VB-CE Seite, allerdings schwach frequentiert. |
| microsoft.public.pocketpc | |
| microsoft.public.pocketpc.binaries | |
| microsoft.public.pocketpc.developer | |
| microsoft.public.pocketpc.ebooks | |
| microsoft.public.pocketpc.marketplace | |
| microsoft.public.pocketpc.multimedia | |
| microsoft.public.sqlserver.ce | |
| microsoft.public.win32.programmer.wince | |
| microsoft.public.windowsce.app.development | |
| microsoft.public.windowsce.embedded | |
| microsoft.public.windowsce.embedded.vb | |
| microsoft.public.windowsce.embedded.vc | |
| microsoft.public.windowsce.platbuilder | |
| microsoft.public.windowsce.platbuilder.beta | |
| microsoft.public.windowsce.targeted.device |
11.Wie bekomme ich per Code
Datenbankdaten zwischen PPC und PC transferiert?
Dazu muß zuerst die adofilt.dll (mit ActiveSync
mitgeliefert) ins Systemverzeichnis von Windows (\windows\system) kopiert
werden. Danach ist mittels API-Funktionen "DESKTOPTODEVICE" und "DEVICETODESKTOP"
eine Übertragung möglich. Aber Achtung: da momentan keine
Replikationsmechanismen möglich sind, sind die Funktionsargumente, die die
Replikationsfunktionalität darstellen nur Kosmetik.->
12. Kann man die eingebaute
Tastatur per Code ein- oder ausschalten?
Ja, aber nur per API-Funktion ->(Funktioniert
übrigens auch mit CE3.0)
13.
Kann man per Code den Batteriestatus erfragen?
man kann, allerdings auch nur mittels der API, und da UDT's
(Benutzerdefinierte Datentypen) nicht existieren, nur mittels eines Tricks ->
14.
Wie kann ich verhindern, daß ein Benutzer eine weitere Applikation startet,
wenn mein Programm läuft?
Am einfachsten, indem man die Taskleiste auf "Autohide" stellt
und dann mittels vbcetaskbarcontrol verhindert, daß diese eingeblendet wird.
vbcetaskbarcontrol ist ein auf www.cegadgets.com
frei verfügbares Control zum Sperren/Entsperren der Taskleiste. Unter CE3.0
(PocketPC) wird nur eine Instanz der Applikation gestartet.
15.
Ich habe keinen Filemanager auf meinem CE-Gerät,
wie kann ich dennoch Programme ausführen, die nicht im Startmenü gelistet
sind?
Tastatur einblenden,
"run23" eingeben, und schon erscheint das "Datei-Ausführen"
Dialogfenster. Dieser Trick funktioniert allerdings nur auf CE2.X -Systemen.
16.
Wie
kann man die Form des Maus-Cursors ändern (Hourglass anzeigen)?
Dazu gibt es grundsätzlich zwei Möglichkeiten: entweder man setzt ein
fremd-OCX ein (z.B. Utility-Control von www.vbce.com)
, das eine Methode zur Anzeige des Hourglasses besitzt, oder man schreibt eine
Funktion, die die LoadCursor-Funktion der coredll aufruft..Bei
Pocket-PC-Applikationen kann das Screen-Objekt (screen-Mousepointer) dazu
benutzt werden.
17.
Wie kann man die Füllgeschwindigkeit eines Kombinations- oder
Listensteuerelementes erhöhen?
Seltsamerweise wird die Geschwindigkeit beim
Füllen von Combo- oder Listfeld-Steuerelementen z.T. dramatisch erhöht, wenn
man das betroffene Steuerelement vorher unsichtbar macht (visible=False).
18.Wie
kann man per Code Kontrast und Helligkeit des Displays ändern?
Leider habe ich auch nach intensivster Suche noch
keine allgemeingültige API gefunden, die dies bewerkstelligt. Man ist deshalb
wohl dem Hersteller ausgeliefert, wenn der keine Angaben dazu macht- kaum eine
Chance.
Ein indirekter Weg ist der Aufruf der Systemsteuerung aus dem eigenen Programm heraus. Leider funktioniert der Aufruf der Sektion "Kontrast" nicht auf allen PocketPC-Geräten (z.B. nicht iPaq 31xx).
19.Wie
registriert man fremd-ActiveX-Controls oder DLL's ohne Installationsprogramm?
Relativ einfach: man lade sich regsvr2.exe von www.cegadgets.com
(Jeff Zamora) herunter, unt führe es mit dem unter Punkt 15 gezeigten Trick
aus. Mit Hilfe dieses Programmes kann man recht komfortabel Controls
registrieren und deregistrieren.
20.
Wie kann man ein Syncronisationsprogramm automatisch bei erfolgreichem Connect
zum Desktop starten?
Dazu existieren Registrierungsschlüssel in der
Desktop-Registrierungsdatenbank:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
CE Services\AutoStartOnConnect
b.z.w.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
CE Services\AutoStartOnDisconnect
Der jeweilige Schlüssel enthält den vollständigen Dateinamen/Pfad
der auszuführenden Datei.
21.
Kann man das Toolkit für VB6 und das neue "embedded Toolkit"
gleichzeitig betreiben?
Ja, eigentlich ohne Probleme. Man sollte
allerdings separate Kopien der Projektdateien erstellen, die man
"portieren" möchte, da beim Speichern "alter" Form-Dateien
aus dem embedded Toolkit diverse nicht mehr unterstützte Eigenschaften einfach
gelöscht werden. Ein solches Projekt ist mit dem VB6-Toolkit dann nicht mehr
fehlerfrei zu öffnen.
22.
Was muß man beim Portieren einer VB6-Toolkit-Anwendung in eine
"embedded-Version" beachten?
Es werden keine Form Menü's mehr unterstützt!
Man muß also wohl oder übel alle Forms, die eine Menüleiste haben mit dem
CommandBar-Steuerelement ausrüsten. Diverse Form Eigenschaften werden nicht
unterstützt. Diese sollten entweder mit einem Editor manuell auskommentiert werden, oder man speichert die Forms aus dem embedded-Toolkit erneut ab, dann
sollte eVB das Entfernen übernehmen.
23.
Beim Ausführen des Installationsprogrammes eines selbsterstellten Programmes
bleibt des CE-Gerät beim Registrieren der Steuerelemente hängen, was tun?
Das Problem ist MS bekannt (Q240435), es tritt
nur bei einigen wenigen CE-Geräten auf. Die Ursache liegt bei der Datei WCELOAD
im \Windows-Verzeichnis. Dazu kann von Microsoft ein Patch abgeladen werden, der
eine neue WCELOAD für SH3 und MIPS enthält. Sollte der Updater wieder erwarten
nicht laufen, so kann man die Files auch manuell ins Windows-Verzeichnis
kopieren, dazu muß die jeweilige Datei (wce4000.bin für MIPS und wce10003.bin
für SH3-Prozessoren) in wceload.exe umbenannt werden.
24.
Mich stören "Start"-Button und
"SIP"-Tastaturbutton in meiner CE-3.0 Applikation, kann ich beides
ausblenden?
a. Aber: ausschließlich per API-Aufruf. Die
durch die API-Funktion "beseitigten" Funktionsknöpfe bleiben
eventuell aber leider nicht über die gesamte Programmlaufzeit
"verschwunden", jedes neue Formular, das geöffnet wird läßt auch
die Funktionsknöpfe wieder erscheinen :-(. Einzige Möglichkeit ist die
separate Behandlung in jedem neuen Formular (und u.U nach jedem Form.hide). Wer
sich also mit diesen Funktionsköpfen nicht anfreunden kann, hat ein dickes
Problem ;-). Der API-Aufruf kann nicht in Form.activate oder form.load plaziert
werden, da dort wirkungslos, ein einfacher Trick ist ein plazierter timer, der
von form.activate gestartet wird und bei Auslösen sich selbst deaktiviert und
den API-Aufruf startet. Ein ständiges "pollen" eines Timers um die
Buttons dauerhaft zu entfernen ist einen Versuch wert, kostet aber Rechenzeit
und erschwert sinnvolles Debugging.(Code folgt.)
25
Kann man zur Laufzeit den noch freien Speicher/den
belegten Speicher des
Gerätes ermitteln?
Ja, allerdings wieder nur per API. Die Funktion
heißt GetDiskFreeSpaceEx. Diese Funktion ermittelt eigentlich den noch freien
Speicher des CE-Dateimediums, da dieser aber auch der Programmspeicher ist, kann
man somit auch den verfügbaren Programmspeicher/Datenspeicher ermitteln. Eine schnelle Variante zur Ermittlung von Speicherparametern ist der Aufruf
der Funktion GlobalMemoryStatus, allerdings wird hier eine Struktur
gefüllt, die wie unter (27) behandelt werden muß, um korrekte Werte zu
ermitteln.
26 Meiner eVB-Applikation steht zur Laufzeit
immer weniger Speicherplatz zur Verfügung, was ist die Ursache und wie kann ich
das Problem beheben?
Microsoft hat ein
Problem mit der aktuell ausgelieferten pvbload.exe! Die Funktion
CreateObject erzeugt Speicherleaks. Die von dieser Funktion z.T. sporadisch
erzeugten Leaks können nicht reallokiert werden und stehen dem CE-Gerät zur
Laufzeit des eVB-Programms nicht mehr zur Verfügung. Einzige Möglichkeit ist
die Definition von Objekten zum Programmstart und der ausschließliche Zugriff
auf diese Objekte während der Programm-Laufzeit. Wer's selbst ausprobieren
möchte: Ein einfaches EinForm-Projekt mit einem Timer ausstatten, dessen
Funktion den verfügbaren Speicher anzeigt (siehe Punkt 25), einen zusätzlichen
Button auf der Form plazieren und innerhalb der Click-Sub des Buttuns mit einer
For/Next-Schleife "CreateObject" 10 mal ausführen lassen (z.B. set
rs=CreateObject("ADOCE.RECORDSET.3.0"). Button zur Laufzeit öfter mal
anticken, Speicheranzeige beobachten....und Staunen!
27
API-Funktionen verlangen eine Struktur/geben eine Struktur zurück. eVB
unterstützt aber keine benutzerdefinierten Datentypen. Wie kann man solche
API's trotzdem benutzen?
Jede API-Struktur ist die Verkettung ihrer
Inhalte. Der Trick dabei ist die Darstellung der Struktur in einem String. Jedes
Strukturelement kann mit MidB gesetzt oder gelesen werden. Ein wirklich gutes
Beispiel ist in http://www.vbce.com/articles/udt/index.asp
dokumentiert.
28.
Wie spielt man Sounds ab?
Zum Abspielen von Sounds existiert eine
API-Funktion (PlaySound). Diese Funktion kann mittels Optionen Sounds Syncron
(Funktion kehrt erst zum Aufrufer zurück, wenn Sound fertig gespielt ist) oder
Asyncron (Funktion kehrt sofort zum Aufrufer zurück) abspielen.
29
Wie öffnet man die Systemsteuerung aus dem eigenen Programm heraus?
Indirekt, indem man sich der realen
Systemsteuerung durch Erzeugung eines neuen Prozesses bedient
(CreateProcess-API-Funktion)
30.
Kann man das Gerät per Code ausschalten?
Man kann, mitels API und
Tastatur-Emulation.
31.
Mittels ActiveSync Tabellen aus dem PocketPC/PPC in eine MDB auf dem Desktop
exportieren ist kein Problem, aber wie kann ich Tabellen vom PC mittels
ActiveSync in den ObjectStore importieren?
Da der ObjectStore keine "echte"
Datenbank in Form einer *.cdb-Datei darstellt hat man mit dem Tabellenimport vom
PC in den PocketPC per ActiveSync offensichtlich ein Problem. Als Ziel des
Tabellenimports muß einfach nur der <virtuelle> Verzeichnisname des
ObjectStores angegeben werden, bei deutschen Geräten ist das dann
"\Datenbanken".
32.
Kann man die Breite/Höhe von Scrollbars und die
Größe der Combobox-Ausklapp-Pfeile verändern?
Ja, allerdings nicht mit dem sonst üblichen Versenden von Systemmitteilungen
sondern mit Registry-Einstellungen. In der Registry finden sich unter
\HKEY_LOCAL_MACHINE\SYSTEM\GWE\ folgende Schlüssel:
| cyHScr | Höhe der horizontalen Scrollbar in Pixel, default:13 |
| cxHScr | Breite der horizontalen Scrollbar-Elemente in Pixel (Pfeile), default 20 |
| cyVScr | Höhe der vertikalen Scrollbar-Elemente in Pixel (Pfeile), default 20 |
| cxVScr | Breite der vertikalen Scollbar in Pixel, default 13 |
33.
Öffnen und Schließen von Forms animieren
Um beim Öffnen und Schließen einer Form eine Animation anzeigen zu lassen
(sich vergrößernder Rahmen beim Öffnen, sich verkleinernder Rahmen beim
Schließen) muß folgender Registry-Schlüssel auf den Wert "1"
gesetzt werden:
\HKEY_LOCAL_MACHINE\SYSTEM\GWE\Animate
34. Wie
kann man die Gerätebezeichnung erfragen?
Mittels API-Funktion "SystemParametersInfo".
Siehe Codebeispiel "Gerät, wer bist Du?".
35. Woher bekommt man die Seriennummer? (Außer vom Aufkleber an der Rückseite oder der Originalverpackung)
Grundsätzlich gibt es zwei Wege, erstens kann man die API-Funktion KernelIOControl nutzen, zweitens kann man einen recht simplen Trick anwenden: im Windows-Verzeichnis befindet sich die Datei "CreateAssetFile.exe", bei deren Ausführung im selben Verzeichnis die Datei "cpqAssetData.dat" erzeugt wird. Diese Datei enthält ab Position 976 die Seriennummer des Gerätes. (Siehe unter Code/Seriennummer ermitteln).