Dialog aufruf von einer DLL
-
Hallo Zusammen
Ich bin am verzweifeln.
Ich möchte folgendes machen:Ich habe eine Exe --> Hauptapplikation.
Ich habe ein DLL, hier habe ich alles ausgelagert was mit Reporting zu tun hat.Ich möchte das dieses DLL alleine steht, dass wenn ich einen Bug beheben sollte, ich nur das DLL auswechseln kann und nicht gleich alles liefern muss.
Ich selber will nix mit der Hauptapplikation zu tun haben.
In diesem DLL hat es auch Dialoge.
Mit dem habe ich nun meine Mühe damit.
Der Main Dialog im DLL ist eine Art UserControl. Das heisst der Dialog soll in einem Dialog in der Main angezeigt werden.Als Beispiel was funktioniert:
aus der Main rufe ich folgendes auf:void CtestDlg::OnBnClickedButton3() { Blubb b; b.GibMirdenDialog2(); }
Im DLL (als Popup)
void Blubb::GibMirdenDialog2() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); ftest* btest = new ftest(NULL); btest->DoModal(); delete btest; }
klappt alles, nur so will ich es nicht.
Ich möchte dies als child objekt integriert haben in meiner Main.Aus der Main:
void CtestDlg::OnBnClickedButton2() { Blubb b; b.GibMirdenDialog3(this); }
in der DLL
void Blubb::GibMirdenDialog3(CWnd * parent) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); ftest2 * btest = new ftest2(parent); btest->ShowWindow(SW_SHOW); // Hier würde ich die grösse des fensters noch anpassen... delete btest; }
Hier knallt es beim ShowWindow...
Es ist mir klar, dass meine Beispiele übel sind....
Es geht mir jetzt nicht darum welche Pointer noch hängen bleiben sondern ob das, was ich gerne möchte überhaupt möglich ist...
Oder ist der Ansatz komplett falsch?Ich komme aus der C# Umgebung und bin mich im C++ am einarbeiten.
Gruss
Philipp
-
Dein 2. Ansatz sollte (fast) so funktionieren, nur darfst du dann natürlich nicht
delete btest;
dort aufrufen, sondern müßtest dies in eine extra Funktion auslagern, welche dann von der Main-Applikation aus aufgerufen werden sollte.
Statt ShowWindow solltest du auch einfach den 'Parent' setzen:
ftest2 * btest = new ftest2(parent); btest->SetParent(parent);
(s. CWnd::SetParent)
PS: In C# (WinForms) funktioniert es ja genauso, da ja beides auf der WinAPI beruht
-
bacca schrieb:
Hier knallt es beim ShowWindow...
ShowWindow ist hier ja auch die falsche Funktion. Du suchst CreateWindow.
-
Hallo Zusammen
ja shit...
Ich habe mir für dies ein kleines Beispiel (schnell,schnell) gebaut....
Schnell schnell ist nicht immer gut...void Blubb::GibMirdenDialog3(CWnd * parent) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); btest = new ftest2(parent); btest->Create(ftest2::IDD, parent); btest->ShowWindow(SW_SHOW); CRect rect; parent->GetWindowRect(rect); btest->ScreenToClient(rect); btest->MoveWindow(rect.left, rect.top, rect.Width(), rect.Height()); }
Vielen Dank für eure Hilfe
Mit eurem Input funktioniert es.Jetzt versuche das in so zu implementieren.
Oder besser gesagt muss ich herausfinden warum es in meiner Test Appl klappt und im anderen nicht.Gruss
Philipp