bigpoint Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 Ich habe eine SDI Anwendung jetzt will ich daß der User merere Dialoge bzw. Form in einem SDI abrufen. So weit so gut, aber jetzt möchte ich die Form nicht alle in einem Projekt haben sondern in verschiedenen. Kann man die als DLL machen und wenn ja dann natürlich wie was muß man da beachten ??? Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 Kannst du vielleicht nochmal genau erklären was du machen willst? Ich glaube dich soweit verstanden zu haben das du mehrere Dialogen in dein Projekt einfügen willst, aber das mit der DLL und so hab ich nicht kapiert. Gruß Guybrush Zitieren
bigpoint Geschrieben 28. Oktober 2002 Autor Geschrieben 28. Oktober 2002 Ja aber sehr gerne ;-) Also ich habe eine SDI Anwendung und wie üblich ist bei einem SDI sind Form also so wie Dialoge. Jetzt ist so dass ich die Form zentral verwalten will dh. ich möchte für meine SDI nur die Form abrufen zu können die ich brauche, natürlich konnte ich alle Form in einem Projekt ( SDI ) einklopfen aber dann wird meine .exe groß und manchmal ist so dass eine Version braucht nur zwei Form und andere 5. Deswegen habe ich mir gedacht am besten wehre wenn ich die Form in DLL so wie beispielsweise man icons in DLL speichern kann. Ich hoffe dass ich es dir gut erklärt habe denn es ist für mich wirklich wichtig das auf die reihe zu bringen Vielen Dank im Voraus Zitieren
Guybrush Threepwood Geschrieben 29. Oktober 2002 Geschrieben 29. Oktober 2002 Das weiß ich jetzt auch nicht, aber wenn du die Dialoge mit dem Resourceneditor erstellst, kannst du ja einfach mal versuchen diese dann in der DLL zu exportieren. Zitieren
bigpoint Geschrieben 29. Oktober 2002 Autor Geschrieben 29. Oktober 2002 Originally posted by Guybrush Threepwood Das weiß ich jetzt auch nicht, aber wenn du die Dialoge mit dem Resourceneditor erstellst, kannst du ja einfach mal versuchen diese dann in der DLL zu exportieren. also die Dialoge in DLL zu erstellen ist kein Problem, nur die in SDI abzurufen da weis ich nicht wie Zitieren
Guybrush Threepwood Geschrieben 29. Oktober 2002 Geschrieben 29. Oktober 2002 versuch doch mal den Dialog genauso wie eine Funktion zu importieren Zitieren
bigpoint Geschrieben 30. Oktober 2002 Autor Geschrieben 30. Oktober 2002 Originally posted by Guybrush Threepwood versuch doch mal den Dialog genauso wie eine Funktion zu importieren Also ich erstelle eine MFC-DLL dann erstelle ich ein Form und so versuche ich es zu rufen: extern "C" __declspec(dllexport) void GibWindow() { TestForm *Form = new TestForm; Form->DoModal(); delete Form; } jedoch dann kriege ich Fehler estForm::TestForm" : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "TestForm" erfolgte : Siehe Deklaration von 'TestForm::TestForm' : error C2039: 'DoModal' : Ist kein Element von 'TestForm' : Siehe Deklaration von 'TestForm' : error C2248: "TestForm::~TestForm" : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "TestForm" erfolgte : Siehe Deklaration von 'TestForm::~TestForm' :confused: Zitieren
Klotzkopp Geschrieben 30. Oktober 2002 Geschrieben 30. Oktober 2002 Zeig mal bitte die Deklaration von TestForm. Zitieren
bigpoint Geschrieben 30. Oktober 2002 Autor Geschrieben 30. Oktober 2002 class TestForm : public CFormView { protected: TestForm(); // Dynamische Erstellung verwendet geschützten Konstruktor DECLARE_DYNCREATE(TestForm) // Formulardaten public: //{{AFX_DATA(TestForm) enum { IDD = IDD_FORMTesT }; // HINWEIS: Der Klassen-Assistent fügt hier Datenelemente ein //}}AFX_DATA // Attribute public: // Operationen public: // Überschreibungen // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(TestForm) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL // Implementierung protected: virtual ~TestForm(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif // Generierte Nachrichtenzuordnungsfunktionen //{{AFX_MSG(TestForm) // HINWEIS - Der Klassen-Assistent fügt hier Member-Funktionen ein und entfernt diese. //}}AFX_MSG DECLARE_MESSAGE_MAP() }; das hast du gemeint ? Zitieren
Klotzkopp Geschrieben 30. Oktober 2002 Geschrieben 30. Oktober 2002 Originally posted by 007ski das hast du gemeint ? Genau das. Deine Klasse ist von CFormView abgeleitet. Die kannst Du nicht mit DoModal anzeigen. Dazu müsstest Du eine von CDialog abgeleitete Klasse verwenden. Zitieren
bigpoint Geschrieben 30. Oktober 2002 Autor Geschrieben 30. Oktober 2002 Ja und wenn die von CFormView abgeleitet ist wie kann ich da sie anzeigen, denn ich muß es von CFormView ableiten denn schließlich will ich es später in SDI Anwendung verwenden und nicht als eigenen Dialog. Außerdem es liegt nicht in CFormView zuerst denn auch wenn ich nur so schreibe AFX_MANAGE_STATE(AfxGetStaticModuleState()); TestForm * Form = new TestForm; Kriege ich auch Fehler: error C2248: "TestForm::TestForm" : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "TestForm" erfolgte Zitieren
bigpoint Geschrieben 30. Oktober 2002 Autor Geschrieben 30. Oktober 2002 Mein TestForm(); wahr protected. Wenn ich ihn public mache dann ging's Weist wie kann ich die sonst anzeigen bei Form Zitieren
Klotzkopp Geschrieben 30. Oktober 2002 Geschrieben 30. Oktober 2002 Originally posted by 007ski Mein TestForm(); wahr protected. Wenn ich ihn public mache dann ging'sAutsch! Dass der Konstruktor bei CView und abgeleiteten Klassen protected ist, hat seinen Grund. Die View wird von der Frame-Klasse erzeugt, nachdem das Template das Dokument erstellt hat, und zwar über die statische Create-Funktion, in der dann der Konstruktor aufgerufen wird. Du kannst diese Klassen nicht wirklich voneinander trennen, daher kannst Du eine View allein auch nicht anzeigen. Zitieren
bigpoint Geschrieben 31. Oktober 2002 Autor Geschrieben 31. Oktober 2002 Originally posted by Klotzkopp Du kannst diese Klassen nicht wirklich voneinander trennen, daher kannst Du eine View allein auch nicht anzeigen. Moment ich will nicht die Klassen trennen. Vielleicht habe ich mich schon wieder falsch ausgedruckt ich will einfach eine DLL schreiben wo Form sind und die in eine SDI Anwendung abzurufen – mehr nicht. Es muss doch irgend wie gehen beispielsweise mit Borland soweit ich es weis ruf man die Form mit ShowModal() auf auch in DLL‘S. Man kann doch ein SDI schreiben die mehrere Form abruft (switch) also die eine aus- die andere an-blend, dann kann ich auch doch die Form in DLL packen und dann abrufen die müssen doch nicht in gleichem Projekt sein oder ??? :confused: Zitieren
Klotzkopp Geschrieben 31. Oktober 2002 Geschrieben 31. Oktober 2002 Der Begriff "Form" ist in den MFC nicht vorhanden. Borland mag über dieses Konzept das Laden aus DLLs unterstützen. Aber das Document/View-Klassenmodell der MFC sieht meines Wissens nicht vor, dass Klassen oder Ressourcen aus anderen Modulen bezogen werden. Womöglich kannst Du das erreichen, indem Du Template, Doc, View und Frame komplett in die DLL auslagerst. Alternativ könntest Du die Dialogressource, die die View nutzt, in eine MFC Extension DLL auslagern. Zitieren
bigpoint Geschrieben 5. November 2002 Autor Geschrieben 5. November 2002 Es tut mir leid Klotzkopp aber ich glaube du hast mich falsch verstanden ;-( Man kann woll Ressource in eine Dll verwenden wie beispielsweise Bitmap Menu Dialog usw. Das will ich auch versuchen leider habe keine große Erfahrung mit DLL. Also ich versuche noch einmal, vielleicht habe ich mich jetzt besser ausgedruckt Ich erstelle eine MFC DLL da erstelle ich ein Dialog oder Formansicht ( CformView) und so rufe ich es ab in DLL: // Ruft Dialog auf extern "C" __declspec(dllexport) void GibDialog() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); TMDialog *pdialog = new TMDialog; pdialog->DoModal();//Create( IDD_DIALOGTM, pdialog); delete pdialog; } im SDI Anwendung in der View.h deklariere bzw rufe ich DLL so: extern "C" __declspec(dllimport) void GibDialog(); und in der cpp so: void CGFSCORPUS1View::OnModuleGfsfido() { GibDialog(); } ich hoffe es hilft Zitieren
Guybrush Threepwood Geschrieben 5. November 2002 Geschrieben 5. November 2002 Selbst wenn das so funktioniert ( ) würde ich aber mit der Funktion GibDialog() anstatt void ein HANDLE auf das Fenster zurückgeben damit du auch damit was machen kannst. Zitieren
fmarx2000 Geschrieben 5. November 2002 Geschrieben 5. November 2002 (Off Topic) @fmarx2000: Wenn Du nichts hilfreiches beizutragen hast, dann solltest Du besser gar nicht erst antworten. Dieses Forum dient nicht dazu, dass Du Deinen Unmut kundgeben kannst. Ich verweise auf Punkt 1 der Boardregeln. Betrachte Dich als verwarnt. Klotzkopp Zitieren
Klotzkopp Geschrieben 5. November 2002 Geschrieben 5. November 2002 Die Lebenszeit einer View beschränkt sich im Gegensatz zu einem Dialog nicht nur auf Erzeugen - DoModal - Zerstören. Eine View ist nur ein Teil eines zusammenhängenden Gebildes, zu dem auch Template, Dokument und FrameWindow gehören. Du kannst eine View nicht wie einen modalen Dialog auslagern. Was vielleicht funktionieren mag: In einer DLL das View-Objekt zu erzeugen und einen Zeiger darauf rauszugeben. Die richtige Stelle, das aufzurufen, wäre die OnCreateClient-Methode der Frame-Klasse. Da drin wird normalerweise CreateView aufgerufen, was Du dann natürlich nicht machen darfst. Zitieren
rscheyerle Geschrieben 31. Mai 2005 Geschrieben 31. Mai 2005 Hallo! Gab es zu diesem Thema irgendwelche konkreten Lösungen??? Ich sitze nämlich gerade am selben Problem! Ich hab eine SDI und eine DLL. In der SDI werden 2 Standard-Views erzeugt (Toolbar links, Start-Bild rechts). Rechts sollen später andere Dialog (Views) gezeigt werden. Die Views sollen in der DLL erstellt werden und schließlich bei Bedarf in der SDI angezeigt werden. Bis jetzt lief alles wunderbar, aber als ich den View erzeugen will bricht er bei CHandleMap* pMap = afxMapHWND(); ASSERT(pMap != NULL); //hier bricht er ab!!! pMap ist das Ergebnis folgenden Codes: AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState(); // pMap = pState->m_pmapHWND Kann mir jemand sagen warum er mir den ver******* View nicht erzeugt? Und/Oder was CHandleMap ist? Wichtig ist vielleicht noch das ich nicht die MFC-Extension DLL nehme sondern die MFC shared lib. Danke und Grüße vom Bodensee! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.