Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Zeiger auf View an DLL übergeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.07.2004, 00:29 Uhr
~Dirk
Gast


Hi,

ich probiere nun schon seit einer Woche das folgende Problem zu lösen und schaffe es leider nicht. Ich habe eine MDI-Anwendung und eine MFC Standard-DLL. Die MDI-Anwendung lädt die DLL dynamisch und übergibt einen Zeiger auf die View an die DLL. Vor der Übergabe an die DLL ist der Zeiger auf die View noch intakt und funktioniert. Nachdem der Zeiger an die DLL übergeben worden ist, ist er nicht mehr in Ordnung.
Wenn ich z.B. mit dem View-Zeiger innerhalb der DLL GetParentFrame() aufrufe, so kommt es zu einer Assertion.
Woran kann es liegen?
Hat schonmal jemand ähnliche Erfahrungen gemacht?
Ich kann jederzeit ein Beispielprojekt schicken oder Codebeispiele machen, falls es nötig ist, damit ihr mir helfen könnt.

Ich vermute fast, dass es sich um einen MFC Bug handelt. Bei google konnte ich leider nichts darüber finden.

Vielen Dank schonmal im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.07.2004, 10:31 Uhr
~Dirk
Gast


Mit einer SDI-Anwendung passiert der gleiche Fehler. Hier mal ein Beispiel:

View Klasse der Anwendung:

Code:
//DLL bereits erfolgreich geladen
this->GetParentFrame();  //funktioniert hier noch
pSetView(this);   //pSetView ist ein Funktionszeiger auf die Funktion der DLL



Code innerhalb der DLL

Code:
extern "C" __declspec(dllexport) void SetView(CView* pView)
{
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        pView->GetParentFrame(); //hier kracht es auf einmal
}



Am Laden der DLL und an dem Aufruf der Funktion mittels Funktionszeiger liegt es auf keinen Fall. Irgendwie wird bei der Übergabe des Zeigers auf die View ein Fehler von der MFC gemacht. Hoffentlich könnt ihr mir weiterhelfen. Falls etwas unklar ist, stelle ich gerne weitere Informationen zur Verfügung.

Vielen Dank schonmal

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.07.2004, 14:00 Uhr
Spacelord
Hoffnungsloser Fall


Vielleicht hilft dir das weiter:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfcnotes_tn003.asp

Grundsätzlich ist deine Standard MFC-Dll ein von CWinApp abgeleitetes Objekt.Und CWinApp widerum ist von CWinThread abgeleitet. Aus dem sekundären Thread heraus solltest du aber nicht über einen Zeiger versuchen deine View zu modifizieren.
Mehr dazu hier:
http://msdn.microsoft.com/library/en-us/vccore/html/_core_Multithreading.3a_.Programming_Tips.asp
Da schau mal nach den Windows Handle Maps.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 24.07.2004 um 14:08 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.07.2004, 17:56 Uhr
~Dirk
Gast


Hi,

erstmal vielen Dank für deinen Tipp. An so etwas hatte ich gar nicht gedatch. Aber was mache ich jetzt noch falsch? In der DLL gibt es einen Speicherfehler, wenn ich versuche den Fenstertext zu verändern.

in View der Anwendung

Code:
//DLL bereits erfolgreich geladen
pSetView(GetSafeHwnd());  //pSetView ist ein Funktionszeiger auf die SetView-Funktion der DLL



in DLL

Code:
extern "C" __declspec(dllexport) void SetView(HWND hwnd)
{
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        CWnd* pWnd = CWnd::FromHandle(hwnd);
        CView* pView = (CView*)pWnd;
        pView->GetParentFrame()->SetWindowText("jklö");   //hier kommt ein Speicherfehler
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.07.2004, 10:29 Uhr
Spacelord
Hoffnungsloser Fall


So wie ich das sehe besorgst du dir mit FromHandle ein "sicheres" Wrapper Objekt und benutzt dieses aber um mit GetParentFrame erneut einen unsicheren CWnd* zu besorgen um direkt das Fensterobjekt im primären Thread zu manipulieren.
Warum übergibst du nicht gleich das Handle des Frames?
Oder du besorgst dir mit ::GetParent(hwnd) erst das Handle des ParentFrames und benutzt dann FromHandle um dafür einen gültigen Zeiger zu bekommen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 25.07.2004 um 10:29 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.07.2004, 14:22 Uhr
~Dirk
Gast


Danke, mit deinem Tipp hat es jetzt gut geklappt. Dann ist die Übergabe von Objekten also wirklich sehr unsicher und die Verwendung von Handles sicher.
Allerdings habe ich jetzt leider immer noch ein Problem und ich weiss nicht, wie ich es lösen soll.
Meine DLL verwendet eine Bibliothek, die ich nicht verändern darf. Dieser muss man einen Zeiger auf die View übergeben. Und in dieser Bibliothek wird dann pView->GetParentFrame()->SetWindowText("..."); aufgerufen. Dort kracht es ja dann. Was kann ich in diesem Falle tun?

Vielen Dank schonmal

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.07.2004, 14:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


was für eine bibliothek ist das? evtl kannst du dir ja die funktion selbst implementieren, dann kannst du es ja "crash-sicher" machen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.07.2004, 15:06 Uhr
Spacelord
Hoffnungsloser Fall


Sofern die Lib keine Thread startet sollte es auch kein Problem geben.

EDIT:Ach ,du benutzt die Lib ja in deiner Dll (die nen Thread startet).Kannst du deine Dll
nicht als "Nicht-MFC" Dll auslegen?


MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 25.07.2004 um 15:27 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.07.2004, 15:31 Uhr
Spacelord
Hoffnungsloser Fall


Erkundige dich mal über temporäre HandleMaps,damit dürftest du dein Problem unter Kontrolle kriegen.
Das hier ist auf jeden Fall schonmal nen guter Link:
www.microsoft.com/msj/0997/c0997.aspx


MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.07.2004, 21:00 Uhr
~Dirk
Gast


Hi,

ich habe den ganzen Artikel gelesen. Er beschreibt am Ende auch die Problematik ein CWnd* von einem Thread zu einem anderen zu übergeben. Leider finde ich die Lösung in diesem Artikel nicht, oder ich verstehe nicht, wie ich mit den dort angebotenen Programmen das Problem lösen soll. Unter google finde ich leider auch keine guten Treffen für "temporary handlemaps".

Vielleicht sollte ich das Problem ja auch wirklich anders angehen. Aber ich weiß nicht wie. Warum startet diese MFC-DLL eigentlich einen eigenen Thread? Kann ich das unterbinden?
Wie kann ich eine nicht MFC-DLL verwenden, wenn ich einen Zeiger auf eine View dort brauche? Denn dieser Zeiger auf eine View wird doch in einer WinAPI-DLL gar nicht bekannt sein, oder? Startet eine Winapi-DLL keinen eigenen Thread? Warum startet dann eine MFC-DLL einen eigenen Thread und macht dadurch Probleme.

Wie ihr seht habe ich einige Fragen offen. Ich hoffe, dass ihr mir helfen könnt, diese zu klären.

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: