Dialog in DLL einbinden



  • Hi Folks,

    ich habe mit VS .NET 2002 eine MFC-DLL geschrieben in der ich einen Konfigurationsdialog einbinden/anzeigen will. Zur DLL-Resoucendatei habe ich schon einen Dialog hinzugefügt und erstmal 2 Buttons draufgezogen. Ich weis nun nicht wie ich diese Dialogresource mit einer entspr. Klasse verbinde, in der ich z.B. Ereignisbehandlungsroutinen für die Elemente schreibe usw. Ich komm echt nicht weiter.

    MfG F98. 😕



  • Das geht genauso als wenn du den Dialog in der Exe hättest. 🙂



  • 😃 Und wie?



  • du fügst den dialogals resource ein. dann im kontextmenü deines dialogfeldes (im dialogfeldeditor) klasse hinzufügen.

    wenn du das gemacht hast ist alles automatisch drin mit resource.h und allem drum und dran



  • Dann fehlt noch der Dll-Exportkram - aber nach dem hattest du ja nicht gefragt. 😉



  • Ok, ich habe jetzt auf dem Dialog (IDD_CONFIGDIALOG) rechtsgeklickt und eine neue Klasse hinzugefügt:

    #pragma once
    
    // XConfigDialog-Dialogfeld
    
    class XConfigDialog : public CDialog
    {
    	DECLARE_DYNAMIC(XConfigDialog)
    
    public:
    	XConfigDialog(CWnd* pParent = NULL);   // Standardkonstruktor
    	virtual ~XConfigDialog();
    
    // Dialogfelddaten
    	enum { IDD = IDD_CONFIGDIALOG };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	DECLARE_MESSAGE_MAP()
    };
    

    Beim compilieren kommt jetzt: 'IDD_CONFIGDIALOG' : nichtdeklarierter Bezeichner

    🙄

    Wieso kennt jetzt der Compiler nicht die vom Studio automatisch erzeugten Bezeichner? Fehlt mir irgend ein Include?



  • Jupp, das passiert immer bei Dlls:

    #include "resource.h"
    

    fehlt. 🙂



  • Alles klar, nächstes Problem. Im folgenden Codeteil soll der Dialog aufgerufen werden, stattdessen kommt einen Exception:

    bool CAccessObj::OpenBlockConfigDialog(int iID, void *pParams, int iParamSize)
    {
    	CBlock *pBlock = GetBlock(iID);
    	bool bRetVal = true;
    
    	if (pBlock)
    	{
    		// Block-Konfigdialog aufrufen
    		XConfigDialog *XND = new XConfigDialog(NULL);
    
    		if (XND->ShowWindow(SW_SHOW)) // Exception
    		{
    		}
    
    		delete XND;
    	}
    	else bRetVal = false;
    
    	return bRetVal;
    }
    

    Woran kanns liegen?



  • Hat es einen Grund, dass du kein DoModal nimmst?
    Wieso löscht du den Dialog gleich nach dem Aufruf?
    😕



  • ausserdem hast du nur den dialog im speicher rezeugt, aber ihn nicht ordentlich initialisiert (siehe dazu MDSN > CreateEx())



  • Zu Aufklärung: Die DLL stellt Funktionen zur Seriellen Kommunikation mit einem Controller bereit. In der Hostanwendung soll nun dieser Configdialog aufgerufen werden, von mir aus auch modal. Dort wird die Kommunikation und Datenpunkte zusammengeklickert.
    Tja, und jetzt komm ich mit meinem Borland-Halbwissen. 🙂

    ...

    DoModal, CreateEx() ... Hm, da muss ich wohl noch etwas nachlesen. Bis später.



  • Also,

    XND->CreateEx(WS_EX_CLIENTEDGE,
                  _T("STATIC"),
    		  "Test",
    		  WS_CHILD | WS_TABSTOP | WS_VISIBLE,
    		  5,
    		  5,
    		  300,
    		  300,
    		  NULL,
    		  NULL);
    

    oder

    XND->DoModal();
    

    bringen zwar keine Exceptions, er läuft durch den Aufruf durch, dafür wird aber auch nichts angezeigt. Kann das daran liegen, dass meine Host-Anwendung z.Z. ein einfaches Konsolenprogramm ist?



  • *ping*



  • *pong* 🤡

    VC6 oder 2003?
    Ich hab nämlich keine Ahnung und wills gleich mitm richtigen austesten. 🙂



  • Öhm, steht eigentlich auf Seite 1 ganz oben: VS .Net 2002, also VC++ 7.0 Ok, wäre colle wenn Du das mal nachvollziehen könntest, ich stehe hier nämlich trotz Buch irgendwie auf dem Schlauch. 😕



  • Sorry, jetzt wirds vor Montag nix. 😞





  • dlldialog ist ja vom Prinzip her genauso, wie ich es mache.

    Objekt erzeugen, doModal() aufrufen und drauf hoffen das was angezeigt wird.

    doModal() liefert aber bei mir immer -1 zurück, ohne was anzuzeigen, obgleich der Dialg durch den Konstruktor durchgeht.



  • Setz mal einen Breakpoint in DoDataExchange und OnInitDialog.
    Kommt der da vorbei?



  • OnInitDialog gibts bei mir nicht, läßt sich auch nicht hinzufügen. Bei OnDataExchange kommt er nicht durch. Der Code zum Dialog sieht so aus, also noch nischt wildes:

    #include "stdafx.h"
    #include "HKDLL.h"
    #include "XConfigDialog.h"
    
    // XConfigDialog-Dialogfeld
    
    IMPLEMENT_DYNAMIC(XConfigDialog, CDialog)
    
    XConfigDialog::XConfigDialog(CWnd* pParent /*=NULL*/)
    	: CDialog(XConfigDialog::IDD, pParent)
    {
    	Beep(100,10); // hier machts Beep
    }
    
    XNAPConfigDialog::~XNAPConfigDialog()
    {
    }
    
    void XConfigDialog::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(XConfigDialog, CDialog)
    END_MESSAGE_MAP()
    

Anmelden zum Antworten