So was habe ich noch nie erlebt !!!



  • Hallo zusammen,

    ich habe einen Fehler in meinem Programm, den dürfte es gar nicht geben. Folgender Code ist Bestandteil einer größeren Routine und dient dazu, mir spezielle Events aus einem COM-Server (über die TypeLibrary) auszulesen:

    ...module->events =new TList;
    BSTR funcname[1];
    BSTR funcmenue;
    BSTR tmpfuncname;
    
    ...  if (TryStrToInt(funcmenue, menue))
            {
            ShowMessage(IntToStr(menue));
            TServermoduleevent* event = new TServermoduleevent;
            event->name = tmpfuncname;
            event->name = event->name;
            event->memberid = functiondescribe->memid;
            module->events->Add(event);
            menue = 0;
    ...
            } 
    this->Add(module);
    ...
    

    Das komische dabei ist, daß die Events zwar erkannt werden, und auch zur TList module->events hinzugefügt werden, versuche ich aber allerdings von einer anderen Funktion außerhalb auf die TList zuzugreifen ist der Itemcount immer 0 und die gespeicherten Event-Klassen sind verschwunden, obwohl diese TList Bestandteil einer Klasse ist, die während der gesamten Laufzeit des Programms im Speicher gehalten wird.

    Hat jemand soetwas schon mal erlebt?

    Gruß Udo

    Edit: Ich sollte vielleicht noch dazu sagen, daß die Routine schon einmal funktioniert hat. Erst, als ich die if-Bedingung geändert habe, ging sie nicht mehr. Die verwendete Variable funcmenue wird aber korrekt erstellt bzw. aus der TypeLib ausgelesen.

    Edit2: Geändert !

    [ Dieser Beitrag wurde am 14.01.2003 um 02:37 Uhr von Darkheart editiert. ]



  • Überleg mal bitte ein wenig, und frag dich, ob wir mit deinem Code etwas anfangen können.

    ich habe einen Fehler in meinem Programm, den dürfte es gar nicht geben

    Es gibt ihn aber, und es sicher DEIN Fehler.

    module->events =new TList;

    Kann es zufällig sein, dass diese Zeile öfter mal aufgerufen wird? Dann wäre es kein Wunder.



  • Soll ich Dir mal den Code von der gesamten Funktion posten? module->events wird öfter aufgerufen.



  • Ne, aber dir muss doch klar sein, dass ein Helfender wissen muss, von welchem Typ module ist und wie es deklariert ist, wo es allokiert und wieder gelöscht wird. Und, und , und...



  • Außerdem: schieb mal deinen Code weiter nach links und hau die unwichtigen Stellen raus.



  • Ja, das schon! Aber wenn ich Euch die ganze Klasse poste flieg ich wahrscheinlich aus dem Forum. Außerdem wollte ich das Ganze eigentlich nicht zu verwirrend machen.

    module->events ist eine einfach TList, die Pointer (!*ggggggg*) für Eventklassen (sind eigene Klassen) aufnimmt. Normalerweise sollte sie während der ganzen Laufzeit erhalten bleiben und die Eventklassen bereitstellen.

    Komischerweise hats bis heute abend alles wunderbar funktioniert. Erst als ich die if-Anweisung (if (TryStrToInt(funcmenue, menue) ...) geändert hatte, gings nicht mehr. Davor wurde auf TypeLib-eigene Flags geprüft.



  • O.K., den Fehler habe ich jetzt gefunden ! Der Schlüssel dazu war Deine Frage, ob die Funktion mehrmals aufgerufen wird.

    Das ist hier der Fall, weil standartmäßig die TypeInfos der zwei Dispatch-Interfaces einer CoClasse des gerade aktuellen COM-Servers ausgelesen werden (zuerst die Properties und dann die Events).

    Ich habs zwar geändert, aber leider nur sehr unelegant, sprich ich habe die Bedingung in meiner For-Schleife auf i<1 geändert und jetzt gehts. Eigentlich bräuchte ich jetzt ne Funktion, die genau die Dispatch-Schnittstelle für die Properties der CoClasse rauszieht. Hast Du da nen Vorschlag?



  • O.k. hat sich alles erledigt. Lasse jetzt die TList vor meiner For-Schleife erstellen und somit kriegt auch jeder Server nur eine Eventliste. Egal, wieviel Dispatch-Interfaces vorhanden sind.



  • Original erstellt von Darkheart:
    Das ist hier der Fall, weil standartmäßig die TypeInfos der zwei Dispatch-Interfaces einer CoClasse des gerade aktuellen COM-Servers ausgelesen werden.

    Ach so. 😕 😃



  • Ja, ich laß für ein paar COM-Server über LoadTypeLibrary und ein paar andere Funktionen von Windows die jeweiligen TypeLibrarys, die Dispatchschnittstellen etc. auslesen.

    Hat den Hintergrund, daß ich grade für einen Kumpel ne Anwendung programmiere, in der COM-DLL's als Oberflächen eingesetzt werden sollen. Der will nämlich quasi ein Programm mit dynamischer Oberflächengestaltung haben und will nicht jedesmal die Anwendung neu compilieren lassen.

    😃 Udo



  • Ich hatte eigentlich nicht gemeint, dass du mir das erklären musst. Ich versteh's sowieso nicht. 😉



  • Ist gar nicht so schwer! *fg* Allerdings ist das auch mein Erstversuch. Außerdem glaube ich kaum, daß man Dir was erklären muß 😉 oder ?



  • Äh doch. Ich habe weder eine Ahnung, was ein COM-Server ist noch, was eine TypeLibrary noch, was eine Dispatch-Schnittstelle ist. Ehrlich gesagt will ich's auch garnicht wissen. 😉



  • Wo programmierst Du hauptsächlich? Linux oder Windows?



  • Win



  • Ja, und da gibts COM-Server. Aber ich will Dich nicht länger aufhalten. Muß noch ein bischen weitermachen. Die Änderung, die ich gemacht habe, zieht sich jetzt durch das ganze Programm und ich muß noch einiges umstellen.

    Danke Dir für alles!

    Gruß

    Udo



  • Klar man. Immer wieder gern. 🙂


Anmelden zum Antworten