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.