Dialog in DLL einbinden



  • 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()
    


  • du must OnInitDialog() überladen. aber da nicht ankommt ist es eh egal. ruf mal GetLastError() nach xx.DoModal() auf



  • Ok, GetLastError() gibt

    "Die angegebene Image-Datei enthält keinen Resourcenabschnitt."

    zurück.
    Anscheinend scheint er Probleme mit der Dialog-Resource zu haben. Was läuft da falsch?





  • Top, genau das wars!!!! Stand übrigens auch oben in der DLL, konnte ich bloß nicht korrekt zuordnen.

    Hier noch das Bsp:

    // DLL Funktion
    
    bool OpenBlockConfigDialog(int iID, void *pParams, int iParamSize)
    {
          //Wird diese DLL dynamisch an die MFC-DLLs gebunden,
          //muss bei allen von dieser DLL exportierten Funktionen,
          //die MFC-Aufrufe durchführen, das Makro AFX_MANAGE_STATE
          //direkt am Beginn der Funktion eingefügt sein.
    
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    	return theApp.AccessObj->OpenBlockConfigDialog(iID, pParams, iParamSize);
    }
    

Anmelden zum Antworten