Sub-Class Unresolved Externals



  • Sub-Class liefert Unresolved Externals für Methode
    Hallo ich arbeite mit dem Embarcadero CBuilder Seattle und habe folgendes Problem:
    Bei einer Sub-Class für die Properties einer Mail-Komponente bekomme ich, sobald ich die

    __property TStringList* To     =  { read = GetTo, write = SetTo};
    

    einen [ilink32 Fehler] Error: Nicht auflösbares externes '__fastcall TbhsRecipients::GetTo()' referenziert von C:\PROJEKTE\XE10\BHSKOMPONENTEN\ZIMBRA\WIN32\DEBUG\ZIMBRAMAILUNIT.OBJ

    ausgelöst durch die Zeile (im Programm)

     zimbraMail->MailReceipients->To->Add(L"xxx@somewhere.de");
    

    oder irgend eine Methode der Sub-Class,-
    und zwar nur dann wenn das Package in der Liste der Laufzeitpackages aufgenommen wurde. Wenn es nicht der Fall ist, gibt es kein Problem. Alternativ kann auch direkt das private Member angesprochen werden z.B.:

    __property TStringList* To     =  { read =m_To, write = SetTo};
    

    Die Sub-Class sieht so aus:

    class TbhsRecipients : public Classes::TPersistent
    {
       typedef Classes::TPersistent inherited;
       private:
           TStringList  *m_To;
           TStringList  *m_CC;
           TStringList  *m_BCC;
      public:
    
           TStringList* __fastcall GetTo();
           TStringList* __fastcall GetCC();
           TStringList* __fastcall GetBCC();
    
    
           void __fastcall SetTo(TStringList* inListe);
           void __fastcall SetCC(TStringList* inListe);
           void __fastcall SetBCC(TStringList* inListe);
           __fastcall TbhsRecipients();
           __fastcall ~TbhsRecipients();
           void __fastcall ClearAll();
       __published:
           __property TStringList* To     =  { read = GetTo, write = SetTo};
           __property TStringList* CC     =  { read = GetCC, write = SetCC};
           __property TStringList* BCC    =  { read = GetBCC, write = SetBCC};
    
    
    };
    

    Auch eine Verwendung der Methode TbhsRecipients ::ClearAll(); ist nicht möglich.

    Die Haupklasse ist wie folgt (relevante Auszüge):

    class PACKAGE TbhsZimbraMail : public TComponent
    {
    private:
       // Server Communikation
       String m_EMailServerHostName,
              m_UrlSoap,
              m_UrlUpload;
       String m_UrlSoapMask;
       String m_UrlUploadMask;
       String m_Dbug;
    
       TStringList     *m_UpLoadFiles;   ///< FileList fürs Hochladen zum Server Upload
       TbhsSender      *m_Sender;        ///< Sender Daten
       TbhsRecipients  *m_Recipients;    ///< Empfänger Listen (To, CC, BCC)
    U.s.w.:
    __published:
      __property  TZimbraAuthFailedEvent      OnAuthentificationFailed = {read = FOnAuthentFailed, write = FOnAuthentFailed};
      __property  TZimbraAuthentificatedEvent OnAuthenticated        = {read = FOnAuthended, write = FOnAuthended};
      __property  TZimbraSendEvent            OnSendSuccess          = {read = FOnSendSucc, write = FOnSendSucc};
      __property  TZimbraSendFailedEvent      OnSendFailed           = {read = FOnSendFailed, write = FOnSendFailed};
      __property  String      ServerHostName  = {read = m_EMailServerHostName, write = SetEMailServerHostName};
      __property  String      UrlSoap         = {read = m_UrlSoap};
      __property  String      UrlUpload       = {read = m_UrlUpload};
    
      __property  String      UrlSoapMask   = {read = m_UrlSoapMask, write = SetUrlSoapMask};
      __property  String      UrlUploadMask = {read = m_UrlUploadMask, write = SetUrlUploadMask};
      __property  int         SoapPort      = {read = m_Port, write = SetSoapPort, default = 8443};
      __property  String      Dbug          = {read = m_Dbug};
    
      __property  TbhsSender         *MailSender      = {read = m_Sender,       write = m_Sender};
      __property  TbhsRecipients     *MailReceipients = {read = m_Recipients,   write = m_Recipients};
    ...U.s.w.
    
    

    Wobei dann entprechend auch in der Implentierung selbstverständlich die TStringlist Objekte dynamisch im Konstruktor erzeugt und im Destruktor gelöscht werden. Damit gibt es kein Problem.
    Entweder habe ich irgentwas entscheidendes im Code vergessen oder es liegt daran wie gelinkt/compiliert wird. Ich habe fesgestellt, dass das Problem sich durch alle meine Komponenten mit Sub-Classes durchzieht. :face_with_open_mouth_cold_sweat:
    Zur Design Time bekomme ich keine Probleme. Ich kann Werte in die Properties eintragen, sowohl String als auch TStringList. Wieso bekomme isch einen Unresolved External??
    vielen Dank im Vorraus



  • An deiner Stelle würde ich auf den ganzen Delphi Kram verzichten. Kann unter C++ einigen Ärger verursachen, bin damit schon selbst böse auf die Nase gefallen. Bleib so dicht wie möglich am C++ Standard.



  • Hi,
    nach einer kleinen Pause glaube ich es herusgefunden zu haben:
    es muss heissen:

    class PACKAGE TbhsSender :public Classes::TPersistent
    

    anstelle von

    class TbhsSender :public Classes::TPersistent
    

    Dass muss wohl so sein, auch bei den Unterklassen, damit es im Package erscheint.
    Das kann auch mit dem DependenyWalker geprüft werden.
    Das PACKAGE muss dran stehen, damit es im Package erscheint, - hört sich komisch an ist aber so.
    Manchmal muss man es einfach richtig machen dann klappt´s auch mit CBuilder und Delphi, hat mich einen Tag gekostet aber nur so lernt man seinen Pappenheimer kennen.


Log in to reply