Systemsteuerungsanwendung
-
Hallo,
ich muß mich heute schon wieder mit einer Frage an das Forum wenden.
Folgendes Problem (C++Builder2006):
1. ich erstelle eine neue Systemsteuerungsanwendung.
2. die Eigenschaften Caption, AppletIcon, Help werden gesetzt. Die Eigenschaften ResidIcon, ResidInfo und ResidName bleiben wie von der IDE vorbelegt (0).
3. ich erzeuge ein neues Formular, welches später bei Doppelklick angezeigt werden soll (bei OnActivate des Applets). Die entsprechenden Header sind eingebunden aber noch kein Code zur Anzeige des Formulars.
4. das Projekt wird fehlerfrei compieliert. Beim Linken kommt die Warnung: inkrementelles Linken kann nicht ausgeführt werden - voolständige Linken wird ausgeführt...
5. beim starten der erzeugten .cpl-Datei kommt folgende Fehlermeldung: Exception EListError in Modul rtl100.bpl bei 0003156A. Listenindex überschreitet das Maximum (0). Dieser Fehler wird 6mal angezeigt.Ich habe aber praktisch nur den von der IDE erzeugten Standardcode und nirgendwo eine List oder ein Array welche diesen Fehler hervorrufen könnte.
Gruß Udo
-
Hallo,
ich habe das gleiche Problem mit der 2006er Version. Ich weiss auch nicht woran es liegen könnte. Habe meine alten Projekte von der Version 6 mit der 2006er Version kompiliert und es funktionierte nicht. Habe darauf das Projekt neugeschrieben mit der 2006er Version, aber wieder nix. Immer der oben beschriebene Fehler!
Hat jemand einen Tipp??
-
Der von der IDE erzeugte Code ist fehlerhaft. In der <Projektname>.cpp wird in C++Builder 2006 folgender Code generiert:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { using Ctlpanel::Application; Application->Initialize(); Application->CreateForm(__classid(TAppletModule1AppletModule), &AppletModule1AppletModule); Application->Run(); return 1; }
DllEntryPoint wird aber nicht nur nach dem Laden der DLL in einen Prozeß (DLL_PROCESS_ATTACH), sondern auch vor dem Entladen (DLL_PROCESS_DETACH) sowie beim Laden und Entladen in einen Thread (DLL_THREAD_*) aufgerufen. Somit wird das Application-Objekt mehrfach initialisiert, was nachvollziehbarerweise Folgefehler hervorruft.
So sollte die Funktion aussehen (AFAIK tut sie das im C++Builder 2007 auch):
using Ctlpanel::Application; try { if (reason == DLL_PROCESS_ATTACH) { Application->Initialize(); Application->CreateForm(__classid(TAppletModule1AppletModule), &AppletModule1AppletModule); Application->Run(); } } catch (Exception &exception) { Application->HandleException(&exception); } return 1;
-
Danke für den Hinweis. Habe es gleich ausprobiert und jetzt funktionierts.
Es dürfen aber keine weiteren Formulare automatisch erzeugt werden.Gruß Udo
-
Udo_11 schrieb:
Es dürfen aber keine weiteren Formulare automatisch erzeugt werden.
Das stimmt. Diese Beschränkung ist allerdings nicht C++Builder-spezifisch und tritt auch in Delphi auf.
Aber das automatische Erzeugen von mehr als dem Hauptformular sollte man ohnehin vermeiden.