Dialog in DLL einbinden
-
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.
-
Zar schon alt aber
-
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?
-