Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Aktive View in MFC-DLL bestimmen

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 ] > 2 < [ 3 ]
010
16.08.2004, 12:13 Uhr
~mike
Gast


Ähm Stimmt. GetActiveView ist ja framewnd
Probier mal GetParentFrame()->GetActiveView();

Ich hab hier leider keinen VC++ zur Hand (nur nen alten PC und ein Telefon *g*)

((CPartView*)m_pChildView)->AddArtikel(...);
In PartDialog steht dann sowas wie
void CPartDialog::SetDlgView()
{
m_pChildView = GetWindowExe();
}

GetWindowExe ist eine xportierte Funktion aus der exe. Soweit ich das noch weiß, war der Code in der Exe wie im Post 001

mfg

Dieser Post wurde am 16.08.2004 um 12:17 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
16.08.2004, 12:51 Uhr
~Dirk
Gast



Code:
CWnd *pWnd = CWnd::FromHandle(m_hwnd);
CView* activeView = pWnd->GetParentFrame()->GetActiveView();



Ich habe es jetzt so gemacht. m_hwnd enthält das Handle, welches ich innerhalb der View mit GetSafeHwnd() bestimmt habe. Bei GetParentFrame() kracht es allerdings, da das FensterHandle des ParentFrames anscheinend unbekannt ist.

Da diese Lösung nicht zu klappen scheint, will ich es jetzt mit deiner Lösung probieren.
Ich wusste gar nicht, dass man Funktionen innerhalb der exe exportieren kann. Wie macht man das? Wie in einer DLL?
Wie kannst du die Funktion GetWindowExe aus der DLL aufrufen? Hast du an die DLL einen Funktionszeiger übergeben?

Vielen Dank schonmal

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
16.08.2004, 13:26 Uhr
~mike
Gast


Das geht ganz normal mit dllexport und dllimport.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/msmod_20.asp

Einzige Unterschied: export in die exe und import in die DLL. So weit ich das ncoh weiß hat das Problemlos gefuntzt.

mfg
PS: Ich kann am Abend mal meinen Src posten
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
16.08.2004, 14:02 Uhr
~Dirk
Gast


Das wäre super. Leider komme ich abends nicht ins Netz. Aber dann könnte ich es mir morgen ansehen.
Ich habe es aber gerade mal probiert.

In der exe:

Code:
__declspec(dllexport) CView* GetActiveView()
{
    CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetMainWnd();
    CMDIChildWnd* pChild = (CMDIChildWnd*)pFrame->MDIGetActive();
    CView* pView = pChild->GetActiveView();
    return pView;
}



In der MFC-DLL:

Code:
__declspec(dllimport) CView* GetActiveView();
GetActiveView();



Leider klappt es nicht. Ich bekomme einen Laufzeitfehler beim Aufruf dieser Funktion beim Bestimmen von pView.
Was mache ich anders als du? Naja, ich bin auf jeden Fall gespannt darauf, wie du es hinbekommen hast.

Gruß

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
16.08.2004, 15:19 Uhr
~mike
Gast


Hmm. Auf die schnelle hätte ich gesagt, dass das Problem durch den Rückgabewerte entsteht. Das ist bei dllexport einwenig komplizierter
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
16.08.2004, 15:37 Uhr
~Dirk
Gast


Naja, macht ja nichts. Morgen wird das Problem ja dann gelöst sein. Ich muss mir ja eigentlich nur deinen Code der exportierten Funktion GetWindowExe anschauen. Ich bin schon gespannt, wie du es gemacht hast.

Gruß

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
16.08.2004, 20:55 Uhr
~mike
Gast


Mist. Hab ganz verschwitzt das ich das FrameWnd in der DLL hab. Hab das Projekt schon lange nicht mehr gebraucht.
Aber probier mehr folgendes. Auf das wollte ich eigentlich hinaus.
Nur Pseudo Code - eine Testumgebung zu erstellen ist leider sehr schwierig :S
Client

C++:
extern "C" __declspec(dllexport) void SetView(CView *pView)
{  
  CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetMainWnd();
  CMDIChildWnd* pChild = (CMDIChildWnd*)pFrame->MDIGetActive();
  pView = pChild->GetActiveView();
}



DLL

C++:
extern "C" __declspec(dllimport) void SetView(CView *pView);
CView *m_pView;
....
typedef void (CLBFUNC)(unsigned);
CLBFUNC *pFunction;
VERIFY(pFunction = (CLBFUNC*)::GetProcAddress(NULL,"SetView"));
(*pFunction)(&m_pView);



Folgendes Programm hab ich mal geschrieben und hab viel dabei gelernt - d.h. das sseeehhhrrr viele unsaubere Codestellen dabei sind - aber ich wollte ja dabei lernen
Habe mom viel Stress - sonst würde ich noch einwenig testen - sorry
http://mike.dev-geeks.org/stuff/index.php?dir=./dirk

mfg
Edit:
Wenn du das Programm starten willst musst du in GIE nach CGIEApp::OnConnect suchen und die Verbindung mit freesql wählen - bei der anderen // - ansonsten kack das Programm evntl ab - hab die Überprüfung erst ganz zum Schluss eingebaut - weiß nicht ob das die neuste zip ist

Dieser Post wurde am 16.08.2004 um 21:00 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
17.08.2004, 09:21 Uhr
~Dirk
Gast


Ich habe jetzt erst mal deinen angegebenen Code getestet. Damit ich ihn kompilieren konnte, musste ich
Code:
typedef void (CLBFUNC)(CView*);
schreiben. Mit unsigned ging es nicht. Anstatt &m_pView habe ich m_pView geschrieben.

Dann habe ich es ausprobiert. Aber dasselbe Problem wie immer. Beim Holen der Active View ist es abgestürzt. Oder habe durch meine Änderungen irendetwas falsch gemacht?

Naja, ich werde mir jetzt als nächstes deinen Code anschauen. Vielleicht finde ich dann eine Möglichkeit.

Echt Wahnsinn, wie lange ich nun schon an diesem Problem klebe.

Gruß

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
17.08.2004, 12:11 Uhr
~mike
Gast


Stimmt. CLBFUNC muss natürlich CView sein. Trotzdem ist es mir unklar, wie das Programm beim Aufrufen von GetActiveView im Client abstürtzen kann. An welche Stelle springt der Debugger?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
17.08.2004, 12:27 Uhr
~Dirk
Gast


WinFrm.cpp

Code:
CView* CFrameWnd::GetActiveView() const
{
    ASSERT(m_pViewActive == NULL ||
        m_pViewActive->IsKindOf(RUNTIME_CLASS(CView)));
    return m_pViewActive;
}



Laut Debugger ist pChild 0x0000000. Deshalb stürzt es bei der Bestimmung von pView ab. Bei pFrame zeigt der Debugger zwar einen Wert an, sagt aber, dass das hwnd=??? ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ 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: