Mehrdeutigkeit AcitveX (genau machen ??)



  • Hallo,

    mir ist nicht so ganz klar, wo das Problem liegt. Normalerweise sollte diese
    Fehlermeldung angezeigt werden, wenn Du zwei Typen deklarierst, deren Namen
    identisch sind. Dann könntest Du einfach den namespace voranstellen, z.B.

    namespace a
    {
      class TDummy {
        // irgendwas...
      }
    }
    
    namespace b
    {
      class TDummy {
        // irgendwas anderes...
      }
    }
    
    // Verwendung dann an anderer Stelle:
    a::TDummy aDummy;
    b::TDummy bDummy;
    

    Was bedeutet das hier:

    Azad schrieb:

    1x TDevices (HWND ParentWindow)
    1x TDevices (TComponent*Owner)

    Wo taucht denn dieser Fehler auf? Leider ist in Deinem Code-Auszug die Zeile 615 nicht erkennbar.

    Azad schrieb:

    [C++ Fehler] DevicesImpl1.cpp(615): E2015 Mehrdeutigkeit zwischen 'Devices' und 'Kundendevices_tlb::Devices'

    Möglicherweise versucht der Compiler auch die Variable "Devices" als Typ aufzulösen.
    Dann müsste ein Umbenennen schon genügen. Ist vielleicht ohnehin keine so gute Idee
    einer Variablen den Namen eines Typs zu geben. Das sorgt nicht nur beim Compiler für
    Verwirrung.

    Gruß

    Alexander



  • Der CBuilder macht das ja Automatisch da kann ich nix für. Hier stelle mein Projekt mal online dann könnt ihr es euch direkt angucken.

    Download

    Wenn man eine ActiveX-Bibliothek und ActiveX-Form einbindet macht Der C-Builder automatisch was mit den Klassen und Parentwindow..

    Mit der Aussage wollte ich nur klar machen das es von vornerein schon 2 gleiche Klassen gibt, dagegen kann ich bei Versiob 5.0 vom C++ Builder wohl nix machen

    public:		// Anwender-Deklarationen
        __fastcall TDevices(HWND ParentWindow);
        __fastcall TDevices(TComponent* AOwner): TActiveForm(AOwner) {};
    

    wenn ich nun versuche Devices-> zu verlinken weiß er nicht woher er das nehemen soll. Aber guck dir das gesehen am besten selbst an habe ja alle Daetin zur Verfügung gestellt.



  • Kann ich nicht runterladen. Stimmt die Adresse?



  • Schreib doch einfach Kundendevices_tlb::Devices. Dann wäre die Unstimmigkeit doch aufgelöst.



  • Braunstein schrieb:

    Schreib doch einfach Kundendevices_tlb::Devices. Dann wäre die Unstimmigkeit doch aufgelöst.

    ...was ja dann ungefähr dasselbe wie mein anfänglicher Vorschlag wäre.



  • Richtig. Der OP schien es aber nicht so richtig verstanden zu haben, weswegen ich es noch mal verdeutlichen wollte.



  • Hmm das mit dem Kundendevices hatte ich auch schon versucht

    Kundendevices_tlb::Devices->Label1->Caption=DeviceTyp;
    

    dann kommt aber

    [C++ Fehler] DevicesImpl1.cpp(617): E2108 Ungültige Verwendung von typedef 'Kundendevices_tlb::Devices'

    Devices - Die andere URL war leider falsch, hier die richtige 🙂



  • Kann ich mir schon vorstellen, dass das hier nicht funktioniert.

    Kundendevices_tlb::Devices->Label1->Caption=DeviceTyp;
    

    In diesem Namespace ist Devices ein Typ und keine Variable.

    Mein Vorschlag wäre, dass Du Dein Formular umbenennst. Unglücklicherweise
    hast Du für Dein Formular den Namen "Devices" gewählt, d.h. Du hast jetzt
    eine Variable mit Namen "Devices" und einen Typ "Devices". Das halte ich
    für sehr unglücklich. Am Namen des Typs kannst Du wahrscheinlich nicht
    so viel ändern, da dieser durch den Import erstellt wurde.
    Also bleibt nur den Formularnamen zu ändern.

    Gruß

    Alexander



  • Hallo,

    guck es dir einfach an, dann siehst du das es so nicht geht 🙂
    Ich habe es auch schon mit nen anderen Namen mal erstellt ohne nur Device... da ist der selber murks 🙂

    Kundendevices_tlb::Devices ist meines erachtens eh der Falsche Anlaufpunkt die Form liegt ja wo anders sieht man ja rechts in dieser Projektverwaltung 🙂



  • Ich kann da im Grunde nix machen außer richtig zu sagen wo, was, wieso. Der BCB-Builder erstellt das so blöde mit den ParentWindow und ect.

    Hier nochmal, damit es keiner mehr übersieht 🙂

    DEVICES - HIER DOWNLAODEN



  • Hallo,

    natürlich geht das (zumindest bei mir mit Version 2006).
    Ich habe folgendes geändert:
    1. Formularname auf "DevicesForm" geändert
    2. Funktion GetPCTyp in "DevicesImpl1.cpp" geändert:

    STDMETHODIMP TDevicesImpl::GetPCTyp(BSTR DeviceTyp)          //
    {
      try
      {
       DevicesForm->Label1->Caption=DeviceTyp;
      }
      catch(Exception &e)
      {
        return Error(e.Message.c_str(), IID_IDevices);
      }
      return S_OK;
    };
    

    3. In der Header Zeile 146 geändert:

    // vorher
    DECLARE_VCL_CONTROL_PERSISTENCE(TDevicesImpl, TDevices);
    // nachher
    DECLARE_VCL_CONTROL_PERSISTENCE(TDevicesImpl, TDevicesForm);
    

    Damit lässt es sich zumindest kompilieren und linken.

    Gruß

    Alexander



  • Hab ich auch gemacht.. Bei mir gehts trotzdem nicht... oder habe ich was falsch gemacht.. Stell mal bitte das online was du jetzt verändert hast

    Hier mal ne Bildreihe 🙂

    - Bild 1
    - Bild 2

    Habe ich was vergessen ?
    Wie man gleich sieht bekomme ich den gleichen Fehler 🙂



  • Ich weiß nicht, was Du genau gemacht hast, um das Formular umzubenennen
    und was im BCB 5 passiert, wenn man das tut. Ich habe einfach einen anderen
    Namen im Objektinspektor gesetzt. Dabei wurde der Name TDevicesImpl beibe-
    halten. Gut möglich, dass das vom BCB 2006 falsch gehandhabt wird.
    Oder hast Du ein Find/Replace gemacht?

    Eine Sache, die mir noch einfällt, ist, der Variablen einen anderen
    Namen zu geben:

    extern PACKAGE TDevicesForm *DevicesForm;
    

    ändern zu (z.B.):

    extern PACKAGE TDevicesForm *MyDevicesForm;
    

    Ansonsten kannst Du mal danach suchen, wo überall "Devices" (oder jetzt
    "DevicesForm") auftaucht und überlegen, ob Du selbst einen anderen
    Namen angeben kannst. Es geht ja hier nur um einen Namenskonflikt,
    an der Logik ändern Namen ja nichts.

    Gruß

    Alexander



  • Hallo,

    ich habe auch einfach nur per Objektinspector den Namen geändert. Ich gehe davon aus das der BCB 5.0 da irgendwas anderes will braucht.. und ich weiß nicht was habe jetzt mal

    extern PACKAGE TDevicesForm *MyDevicesForm;
    

    in der DevicesImpl1.h eingestellt.

    Dann so umgestellt.

    MyDevicesForm->Label1->Caption=DeviceTyp;
    

    Er scheint die Bezüge schon zu finden denn wenn ich MyDevicesForm-> popt dieses Fenster auf wo man dann die Objekte wählen kann alleridngs kommt ein feler vom Compiler.

    [Linker Fehler] Unresolved external '_MyDevicesForm' referenced from C:\PROGRAMME\BORLAND\CBUILDER5\PROJECTS\ROWI\DEVICES\DEVICESIMPL1.OBJ

    Was muss ich denn noch umstellen um den Linkerfehler zu vermeiden 😞



  • Naja, die Variable ist als extern deklariert. Natürlich musst Du noch in der cpp
    den Namen ändern.

    Gruß

    Alexander



  • Hallo,

    habe das jetzt in der Cpp so gemacht

    TDevicesForm *MyDevicesForm;
    

    Und es kommt kein Fehler mehr beim compilieren. Danke erstmal für deine Hilfe. Nur leider macht das Programm wo ich die .ocx einbinde so einen Fehler, ich weiß nicht wodran es liegt. Entweder allgemein das er mit dem BCB5 nicht klar kommt allerdings zeigt er die Form richtig an.. vllt liegt es auch an meiner ini die ich zum einbinden nutze oder daran wie BCB5 mit den Attributen umgeht.

    Naja ich halte den Thread damit auf den laufenden.


Anmelden zum Antworten