<...zurück>

Die FAQ.

  1. Was heißt eigentlich CE?
  2. Was brauche ich, um VBCE-Applikationen schreiben zu können?
  3. Kann ich alle Controls von Visual Basic weiterbenutzen?
  4. Gibt es Unterschiede zu Variablentypen und Deklarationen im "normalen" VB?
  5. Die Methode "unload form" erzeugt einen Laufzeitfehler, warum?
  6. Kann man MDI-Forms erzeugen?
  7. Kann man Klassenmodule erzeugen?
  8. Existieren Controls zur Datenbankbedienung (ADO/RDO-Steuerelemente)?
  9. Können Felder datengebunden sein?
  10. Gibt es Newsgruppen zum Thema CE?
  11. Wie bekomme ich per Code Datenbankdaten zwischen PPC und PC transferiert?
  12. Kann man die eingebaute Tastatur per Code ein- oder ausschalten?
  13. Kann man per Code den Batteriestatus erfragen?
  14. Wie kann ich verhindern, daß ein Benutzer eine weitere Applikation startet, wenn mein Programm läuft?
  15. Ich habe keinen Filemanager auf meinem CE-Gerät, wie kann ich dennoch Programme ausführen, die nicht im Startmenü gelistet sind? (CE2.x)
  16. Wie kann man die Form des Maus-Cursors ändern (Hourglass anzeigen)? (CE2.x)
  17. Wie kann man die Füllgeschwindigkeit eines Kombinations- oder Listensteuerelementes erhöhen?
  18. Wie kann man per Code Kontrast und Helligkeit des Displays ändern? (Siehe 29.)
  19. Wie registriert man fremd-ActiveX-Controls oder DLL's ohne Installationsprogramm?
  20. Wie kann man ein Syncronisationsprogramm automatisch bei erfolgreichem Connect zum Desktop starten?
  21. Kann man das Toolkit für VB6 und das neue "embedded Toolkit" gleichzeitig betreiben?
  22. Was muß man beim Portieren einer VB6-Toolkit-Anwendung in eine "embedded-Version" beachten?
  23. Beim Ausführen des Installationsprogrammes eines selbsterstellten Programmes bleibt des CE-Gerät beim Registrieren der Steuerelemente hängen, was tun? (CE2.x)
  24. Mich stören "Start"-Button und SIP-Tastaturbutton in meiner CE-3.0 Applikation, kann ich beides ausblenden?
  25. Kann man zur Laufzeit den noch freien Speicher des Gerätes ermitteln?
  26. Meiner eVB-Applikation steht zur Laufzeit immer weniger Speicherplatz zur Verfügung, je länger sie läuft, was ist die Ursache und wie kann ich das Problem beheben?
  27. API-Funktionen verlangen eine Struktur/geben eine Struktur zurück. eVB unterstützt aber keine benutzerdefinierten Datentypen (UDT). Wie kann man solche API's trotzdem benutzen?
  28. Wie spielt man Sounds ab?
  29. Wie öffnet man die Systemsteuerung aus dem eigenen Programm heraus?
  30. Kann man das Gerät per Code ausschalten?
  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?
  32. Kann man die Breite/Höhe von Scrollbars und die Größe der Combobox-Ausklapp-Pfeile verändern?
  33. Öffnen und Schließen von Forms animieren
  34. Wie kann man die Gerätebezeichnung erfragen?
  35. Woher bekommt man die Seriennummer?

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).

<...zurück>