CFtpConnection in andere Klasse übergeben



  • Hallo,

    ich habe ein Projekt in dem ich mit den FTP-Funktionen spiele.

    Nun habe ich ein arges Problem, ...offenbar mit den Grundlagen der OOP 🙄

    In meiner Hauptdialogklasse habe ich zwei Membervariablen in der Klasse
    angelegt:

    CInternetSession session; 
    CFtpConnection* ftpConn;
    

    Nun stelle ich eine Verbindung in der Klasse zu meinem FTP-Server her:

    ftpConn = session.GetFtpConnection("m_Servername","m_Loginname","m_passwort",21,FALSE);
    

    Ich lege eine weitere Klasse für einen IDD_PROPPAGE_DIALOG an (nennen wir die
    Klasse einfach prop1).

    In meiner Hauptklasse kommt oben in der Dlg.cpp ein include für die prop1
    mit rein.

    Nun erzeuge ich in der Klasse prop1 ein Objekt (auch als Membervariable der Klasse):

    HautpdialogDlg zugriff;
    

    Bereits hier meckert der Compiler, dass er die Variable nicht kennt.
    Ich muss

    HautpdialogDlg zugriff;
    

    zwingend unter die includes
    in der prop1.cpp setzen, damit es klappt.

    Und nun greife ich auf ftpConn zu:

    zugriff.ftpConn->PutFile(localfilename,remotefilename,FTP_TRANSFER_TYPE_ASCII,1);
    

    Ich kann kompilieren und das programm starten. Sobald ich aber bei PutFile oder
    irgendwo ankomme, wo ich mit

    zugriff.
    

    arbeiten will, stürzt das
    Programm gnadenlos ab.

    Leider komme ich momentan nicht an den Hauptrechner heran, weil meine Frau
    daran arbeitet. Aber vielleicht seht ihr schon so, was ich da falsch mache.

    Ich vermute, dass ich es einfach mit diesen klassenübergreifenden OOP Sachen
    noch nicht richtig verstanden habe. Da bitte ich um etwas nachsicht 😃



  • Das was du machst funktioniert nicht. Mit der Anweisung

    HautpdialogDlg zugriff;
    

    legst du ein völlig neues Dialogobjekt deiner Hauptdialogs an. Der bekommt nicht mit das irgendwelche Sockets offen sind, da er mit dem Hauptdialog nur die Klassendeklaration gemein hat. Damit existieren 2 Instanzen deiner Hauptdialogklasse, die eine mit offener Connection zum FTP-Server, die andere ohne. Abhilfe: du brauchst doch nur in deinem Prop-Dialog einen Zeiger auf den Haupdialog und greifst darüber auf die Member zu. Voraussetzung ist, diese Member sind nicht private deklariert.
    Einfachste Möglichkeit: Du erweiterst die Prop-Klasse um eine Zeigervariable auf den Hauptdialog (Header einbinden nicht vergessen) und erweiterst weiterhin den Konstruktor deines Prop-Dialoges um einen Zeiger auf das Hauptdialogobjekt:

    //Prop1.h
    #include CHauptdialog.h
    
    ...
    CDeinHauptdialog*    pDeinDialog;
    
    //Prop1.cpp
    CProp1::CProp1(CDeinHauptdialog* pMainDlg)
    {
       pDeinDialog=pMainDlg;
    }
    

    Jetzt dürftest Du immer im Prop-Dialog drauf zugreifen können. Voraussetzung ist aber immer, dass die Hauptdialogklasse noch existent ist, was in deinem Fall immer gegeben sein dürfte.



  • Bereits hier:

    CDeinHauptdialog*    pDeinDialog;
    

    Bekomme ich die Meldung:

    Syntaxfehler: Es fehlt ';' vor '*'

    Meine prop2.h:

    #pragma once
    
    #include "stdafx.h"
    
    #include "afxwin.h"
    #include "FTPBoundDlg.h"
    
    #include "afxinet.h"
    #include "afxext.h"
    
    // prop2-Dialogfeld
    
    class prop2 : public CDialog
    {
    	DECLARE_DYNAMIC(prop2)
    
    public:
    	prop2(CWnd* pParent = NULL);   // Standardkonstruktor
    	virtual ~prop2();
    
    // Dialogfelddaten
    	enum { IDD = IDD_PROPPAGE_MEDIUM1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	DECLARE_MESSAGE_MAP()
    public:
    	CListBox m_box;
    	afx_msg void OnLbnDblclkList1();
    	virtual BOOL OnInitDialog();
    	afx_msg void OnBnClickedButton1();
    	int m_Flag;
    	static UINT thrFunction(LPVOID pParam);
    	void downloaden(void);
    	CFTPBoundDlg *ptrx; //<----------Dort kommt der Fehler!
    
    };
    

    Gehe ich mit der Maus über CFTPBoundDlg zeigt er mir das aber als bekannte Klasse an. Mich irritiert allerdings die Info über dem *ptrx, denn dort erhalte ich

    CFTPBoundDlg prop2::*ptrx
    

    Zudem erhalte ich in der Zeile auch noch:

    'prop2::CFTPBoundDlg': Fehlende Speicherklasse oder Typspezifizierer



  • Du hast höchstwahrscheinlich einen Kreuz-Inkludierung (cross include), d.h. die Header rufen sich gegenseitig auf.
    Du benötigst in dem Dialog-Header aber nur eine sog. Vorwärtsreferenz (forward reference):

    class CFTPBoundDlg; // statt #include "FTPBoundDlg.h"
    

    In der entsprechenden Dialog-Source-Datei (FTPBoundDlg.cpp) mußt dann dann jedoch #include "FTPBoundDlg.h" einfügen, damit die entsprechenden Methoden bekannt sind.



  • Hi TH69,

    du meinst in meiner FTPBoundDlh.h schreibe ich

    class CFTPBoundDlg;
    

    und in der FTPBoundDlg.cpp dann

    #include "FTPBoundDlg.h"
    

    ?

    In meiner anderen Klasse prop2.h/.cpp habe ich dann alleridngs noch immer
    das gleiche Problem. Ich muss dort ja wieder Bezug auf FTPBoundDlg nehmen
    und einen Zeiger oderso angeben, mit dem ich auf die Funktionen/Variablen
    der Klasse FTPBoundDlg zugreife. Wie stelle ich das denn richtig an?


Anmelden zum Antworten