Zum Inhalt springen

DLL und SDI


bigpoint

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by 007ski

Mein TestForm(); wahr protected. Wenn ich ihn public mache dann ging's

Autsch!

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Jahre später...

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...