Standalone Exe



  • Hi!
    Ich habe da ein Problem mit der FAQ (Standalone Exe). Ich mache es so wie es da steht. Wenn ich das Programm dann durchkompiliere und linke (Projekt->erstellen), dann läuft auch alles, und eine große EXE wird generiert. So weit so gut.
    Wenn ich dann aber das Programm aus der IDE heraus starte, bekomme ich eine AccessViolation (bei 0x00000020), und ich muss das Programm beenden (Start->Programm zurücksetzen). Wenn ich irgendeine Zeile im Code auskommentiere und dann nochmals starte, liegt die AccessViolation plötzlich in Adresse 0x00000008.
    Wenn ich die EXE nicht aus der IDE heraus starte, kommt ein Dialog, der mir sagt, dass mein Programm einen Fehler festgestellt hat und beendet werden muss.
    Mit Laufzeit-Packages und dynamischer RTL (auch ohne letztere!) kann ich das Programm allerdings problemlos starten. Ich habe jetzt auch mal alles in FormCreate und im Konstruktor der Form auskommentiert, aber das Problem bleibt bestehen.
    Was könnte das sein, und wie kann man es beseitigen? Danke im voraus für Antworten.

    EDIT: Ach ja, ich benutze den BCB3.



  • Gibts im BCB3 schon CodeGuard? Falls ja, könntest du damit einen Fehler finden.



  • Nein, gibt es leider nicht... Auch das Löschen aller obj-Dateien bringt nüscht.



  • Ohne weitere Infos schwer zu sagen. Verwendest Du Fremdkomponenten? DLLs? Sonst irgendetwas außergewöhnliches?



  • Joe_M. schrieb:

    Ohne weitere Infos schwer zu sagen.

    Ich finde, ich habe schon ne Menge erzählt... 😉 Aber wahrscheinlich ahst du recht.

    Joe_M. schrieb:

    Verwendest Du Fremdkomponenten? DLLs? Sonst irgendetwas außergewöhnliches?

    Keine Fremdkomponenten, aber meine eigenen. Zwei Stück: TLinkLabel und TColorButton. Sind beide auf meiner Homepage einsehbar. Die H-Dateien der beiden sind im Include-Verzeichnis. Im BIN-Verzeichnis sind die bpi- und bpl-Dateien vorhanden, und im LIB-Verzeichnis habe ich die dcr- und lib-Dateien abgelegt.

    Noch ne Info (sehr merkwürdiges Verhalten): Vorgestern noch war es wie folgt: Das gleiche Problem existierte, allerdings ließ es sich leicht beheben. Nach dem Auskommentieren folgender Zeile

    BlendForm(this, true, 200);
    

    hat er kompiliert, gelinkt und gestartet. Ohne Probleme. Dann habe ich den Kommentar vor der Zeile wieder weggemacht, und es lief entgegen aller Erwartungen immernoch. Das habe ich ein paarmal so machen können. Auch gestern. Seit einiger Zeit geht es aber eben nicht mehr so. Die Funktion BlendForm() ist wie folgt definiert:

    void __fastcall BlendForm(TForm* Form, bool in, int ms)
    {
       HMODULE hDll = LoadLibrary("User32.dll");
       if(hDll)
       {
          PTR_AW AnimateWindow = (PTR_AW)GetProcAddress(hDll, TEXT("AnimateWindow"));
    
          if(AnimateWindow)
          {
             DWORD dwFlags = in ? AW_CENTER : AW_CENTER|AW_HIDE;
             AnimateWindow(Form->Handle, (DWORD)ms, dwFlags);
          }
          else
             throw("No Proc");
    
          FreeLibrary(hDll);
       }
       else
          throw("No Lib");
    }
    

    Ich bin aber wirklich nicht sicher, ob es an dieser Funktion liegt. Wie gesagt kommentiere ich die Zeile ja aus, und es funktioniert immernoch nicht...



  • Im Konstruktor deines TLinkLabels reservierst du Speicher, der offenbar nicht wieder freigegeben wird => Destruktor.
    Außerdem versuchst du, in den Settern eben dieser Eigenschaften nochmal Speicher zu allokieren, falls deren Zeiger Null ist. Laß das lieber bleiben, dafür ist der Konstruktor da.

    Ich hatte mal ein Problem bei einer Komponente. Dabei ist beim Platzieren der Komponente die IDE abgestürzt. Ursache war ein

    if (Zeiger) {delete Zeiger;Zeiger=NULL;}
    

    im Destruktor. Einfaches delete hat dann funktioniert.



  • Morris Szyslak schrieb:

    Im Konstruktor deines TLinkLabels reservierst du Speicher, der offenbar nicht wieder freigegeben wird => Destruktor.

    Oh Gott, ja. Das sehe ich jetzt erst. Aber ich meine mich zu erinnern, dass sich der BCB selber darum kümmert, VCL-Komponenten wieder freizugeben.

    Morris Szyslak schrieb:

    Außerdem versuchst du, in den Settern eben dieser Eigenschaften nochmal Speicher zu allokieren, falls deren Zeiger Null ist. Laß das lieber bleiben, dafür ist der Konstruktor da.

    OK, ich sehe die Unsinnigkeit. Der Zeiger wird ja nie NULL werden. Aber das ist sicher nicht das große Problem.

    EDIT: Habe gerade mal ein neues Projekt mit nur einem TLinkLabel erstellt. Das Erstellen und Starten einer Standalone Exe klappt. Also ist das TLinkLabel nicht das Problem.



  • WebFritzi schrieb:

    Aber ich meine mich zu erinnern, dass sich der BCB selber darum kümmert, VCL-Komponenten wieder freizugeben.

    Das ist ein Irrtum.

    BCB-Hilfe schrieb:

    Wenn Sie Ihrer Komponente Klassen hinzufügen, muß sie der Konstruktor initialisieren, damit der Benutzer zur Laufzeit mit den Objekten interagieren kann. Der Destruktor der Komponente muß dagegen die untergeordneten Objekte freigeben, bevor er die Komponente selbst freigibt.

    Verwechsel das nicht mit der Eigenschaft Owner von TComponent.

    Kannst ja spaßeshalber mal deine eigenen Komponenten entfernen und sehen, ob dann das Problem immernoch auftritt. Falls, ja liegt es wirklich nicht am TLinkLabel. An sonsten würde ich aus dem Funktionieren einer sonst leeren Anwendung keine voreiligen Schlüsse ziehen 😉



  • OK, ich werd's heute abend mal ausprobieren. Momentan bin ich leider woanders...



  • Krass! Es scheint tatsächlich an dem LinkLabel oder dem ColorButton gelegen zu haben. Hab die beiden jetzt mal komplett rausgenommen aus dem Projekt, und es klappt. Kann mir das aber trotzdem nicht erklären. Es muss wohl an den Dingen liegen, die Morris angemahnt hat. Aber ich versteh's nicht. Kann mir das vielleicht einer erklären?

    @Morris: Vielen Dank. Ohne dich wäre ich da niemals drauf gekommen. Ich werde die TLinkLabel-Kompo wohl nochmal überarbeiten. Ich verstehe aber einfach nicht, was an dem

    if(!font)
       font = new TFont();
    

    so schlecht sein soll...


Anmelden zum Antworten